Verilog - 我是否需要在两种始终情况下添加延迟并且始终(*)对相同输入敏感?

Verilog - Do I need to add delay with two always situation and also do always(*) sensitive to same input?

1) 如果我有两个总是像这样阻塞:

input [3:0] m1;
reg [3:0] m1_r;

always @(posedge clk) begin
    m1_r = m1_r >> 2; //or #5 m1_r = m1_r >> 2;
end

always @(posedge clk) begin
    m1_r <= m1;
end

我是否需要延迟一小段时间以确保 m1 的值已经加载到 m1_r 中?

2) 如果我总是使用@(*) 块。如果我有两次相同的输入,这个块会被执行两次吗?或者它只是对不同的值敏感?

谢谢!

首先,永远不要在两个不同的 always 块中对单个变量进行赋值。这可能会导致竞争条件,并对合成造成不利影响。

参考试用代码,由于一些常见的原因,这里不能使用always@*。这是一个组合电路,只要 RHS 变量改变,输出就应该改变。

这里,当m1改变时,这个block将值赋值给NBA地区的m1_r(由于非阻塞赋值)。同样,由于 m1_r 在 NBA 区域发生变化,该块将执行第二次;进入活动区域。这在单个时间戳上永远持续下去(请参阅图像中的反馈路径)。因此,要么删除非阻塞赋值,要么避免使用 always @*。我指的代码如下。

  always @(*) begin
    m1_r <= m1;
    m1_r = m1_r >> 2; //or #5 m1_r = m1_r >> 2;
  end

另一方面,使用 always @(posedge clk) 在敏感度列表中仅包含 clk。这将推断为触发器。 该块将仅在时钟边缘执行一次。但是,这里也建议使用非阻塞赋值和单个 always 块。