关于verilog始终块

关于verilog始终块,verilog,hdl,Verilog,Hdl,我有一个总是这样的积木 reg [31:0] r1; always @(posedge clk) if(condition) begin r1<=32'hcafecafe; end 当条件为false时,r1会发生什么情况? 它被合成为什么?我尝试了两种不同的合成器,都将您的代码合成为 reg [31:0] r1 = 32'hcafecafe; 这不是我所期望的,因为此代码的行为方式与RTL不完全相同。在RTL中,r1将是未知的,直到条件为高的第一个时钟边缘,然后它将

我有一个总是这样的积木

reg [31:0] r1;

always @(posedge clk)
  if(condition) begin
    r1<=32'hcafecafe;
  end
当条件为false时,r1会发生什么情况?
它被合成为什么?

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

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

这不是我所期望的,因为此代码的行为方式与RTL不完全相同。在RTL中,r1将是未知的,直到条件为高的第一个时钟边缘,然后它将取值32'hcafecafe。在第一个时钟边缘之前,合成输出的值已经为32'hcafecafe。我本以为合成器的输出是32个启用的D型触发器,其输入与32’hcafecafe相连接

这里的问题是您没有设置任何重置条件。 你的代码说如果条件为真,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

我相信一个综合工具会将其视为

reg [31:0] r1 =32'h????????;

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

由于初始值是一个不在乎的值,唯一其他可能的值是32'hcafecafe,所以合成工具可以自由地将其合成为一个常量值

我假设这个问题是问条件是否与常数0相关联,并且enable永远不会为true。在这种情况下,r1仍然必须是某种东西,条件的真正分支似乎是一个很好的选择。我认为0是另一个很好的选择,但我认为这取决于编译器。这是目前正在发生的事情,但我希望合成工具能够推断出锁存器。有没有什么方法可以让合成工具推断出一个闩锁而不是别的?@a220599你是说闩锁吗?或者触发器?我想推断一个latchIt应该这样处理它,但它所做的是将它合成为r1=32'hcafecafe,将寄存器初始化为常量值,而不是一个锁存器或触发器。问题是您的示例代码没有指定当条件为false时会发生什么。你想要合成的失败以随机状态出现。随机状态可能与32'hcafecafe匹配,在这种情况下,您可以分辨出输出是来自触发器还是由常量驱动。如果您的技术允许,您需要指定一个初始r1状态,或者添加一个重置信号以将您的逻辑合成为一个触发器。我想要的功能如下:当条件为真时,r1被初始化为32'hcafecafe,它应该保持在该状态。你是说我应该定义条件为false时的状态?如果工具允许,你需要将它的初始状态定义为0,或者你需要定义重置状态。