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
块。
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
块。