关于verilog总是阻止

时间:2017-11-27 10:27:17

标签: verilog hdl

我有一个always块,看起来像这样

reg [31:0] r1;

always @(posedge clk)
  if(condition) begin
    r1<=32'hcafecafe;
  end

条件为假时r1会发生什么? 它被合成了什么?

2 个答案:

答案 0 :(得分:1)

我尝试了两种不同的合成器,并且都将您的代码合成为

reg [31:0] r1 = 32'hcafecafe;

这不是我所期望的,因为此代码与完全的行为方式与RTL相同。在您的RTL中,r1condition高的第一个时钟边缘之前将是未知的,因此它将取值32'hcafecafe。在第一个时钟边沿之前,合成输出已经具有值32'hcafecafe。我原本期望合成器输出为32个D型触发器,其输入连接到32'hcafecafe

答案 1 :(得分:1)

这里的问题是你没有设置任何重置条件。 你的代码说如果条件为真,r1应该是32'hcafecafe。如果仔细考虑一下,如果将r1固定为32'hcafecafe,该工具就会完成你告诉它的工作。

正确的代码是这样的:

reg [31:0] r1;

always @(posedge clk)
  if (sync_reset_b == 1) //synchronous reset
      r1<=32'h0; // or whatever you want it to be.
  else if(condition) begin
    r1<=32'hcafecafe;
  end