Verilog中的时间问题

时间:2012-11-15 20:45:22

标签: verilog

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

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

mod模块

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]);

2 个答案:

答案 0 :(得分: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 - mod; mul定义自己这不起作用,你需要添加一个触发器来打破循环。

答案 1 :(得分:0)

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

这里的代码不完整但问题似乎是代码在多个地方分配给'key'。既作为mod实例的输出又作为时钟块的输出。任何时候这两个“不同意”关键的价值它将被视为X. X除了代表未知之外还反映了两个不同任务冲突的争论。

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