0

我是 verilog 的新手,我正在研究定义两个模块的 verilg 代码。第一个模块计算 2 个数字的模数,第二个模块使用结果对其进行一些操作。

结果是错误的,并且有很多无关值,因为两个模块中使用了相同的 clk。任何建议请同步。

模组模块

module mod(m,a,b);
  input  [15:0] a,b;
  output [15:0] m;

  reg [31:0] mod;
  reg [31:0] mul;

  integer i;

  always @* begin
    mul = a*b;
    mod = 32'h80008000;
    for(i=0;i<16;i=i+1) begin
      if(mul > mod) begin
        mul = mul - mod;
        mod = mod >> 1;
      end 
      else begin
        mod = mod >> 1;
      end
    end
    assign m=mul[15:0];
 endmodule 

顶部模块的一部分:

initial begin
  keyp <= 2'b10;
  shift <= 1'b0;
end

 always @(posedge clk) begin
   if(load)
     case (keyp)
       2'b10: begin 
          key[127:64] <= {k1,k0};
          keyp        <= 2'b01;
       end
       2'b01: begin
         key[63:0] <= {k1,k0};
         keyp      <= 2'b00;
         shift     <= 1'b1;
       end
     //default: keyp <=2'b00;
     endcase
   else if (shift) begin
     //shift key for first round
     temp[24:0]    <= key[127:103];
     key[127:25]   <= key[102:0];
     key [24:0]    <= temp [24:0];
     shift         <= 1'b0;
   end
 end

 assign w1[2*SIZE-1:SIZE]   = d1+key[2*SIZE-1:SIZE];
 assign w1[3*SIZE-1:2*SIZE] = d2+key[3*SIZE-1:2*SIZE];

 mod mod1( w1[SIZE-1:0],        d0, key[SIZE-1:0]       );
 mod mod2( w1[4*SIZE-1:3*SIZE], d3, key[4*SIZE-1:3*SIZE]);
4

2 回答 2

0

使用阻塞分配多次分配相同的值是完全有效的 Verilog。即使在两侧出现相同的术语也可以,只要在此之前至少分配一次。

这里的代码不完整,但问题似乎是代码在多个地方分配给“键”。既作为 mod 实例的输出,也作为时钟模块内部。每当这两个“不同意”键的值时,它将被视为 X。X 除了表示未知之外,还反映了两个不同分配冲突的争用。

由于我不确定此代码的用途(似乎是某种加密),因此我无法提供修复,但您需要将分配与密钥分开。

于 2012-11-20T15:26:10.667 回答
0

x 在 casex 语句或卡诺图中被称为不关心,在这里它们表示未知值。未知值可能来自未初始化(重置)的值或多个(冲突)驱动程序。

mod 模块包含这部分代码:

always @* begin
  mul = a*b;
  mod = 32'h80008000;
  for(i=0;i<16;i=i+1) begin
    if(mul > mod) begin
      mul = mul - mod;
      mod = mod >> 1;
    end 
    else begin
      mod = mod >> 1;
    end
  end

always @*是一个组合块,你多次分配 mul 只有最后一次分配会有任何效果。

在这里使用 for 循环使您看起来像是在尝试重用变量,就像在 c 中一样。请记住,我们正在描述硬件,并且该值旨在作为触发器或模块之间的电线存在于某处,并且在任何给定的时钟周期内只能保存一个值。

在您拥有的 mul 定义自己的组合块中mul = mul - mod;,这将不起作用,您需要添加一个触发器来中断循环。

于 2012-11-15T21:41:02.653 回答