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

Verilog-我是否需要在两种情况下添加延迟,并且对相同的输入总是(*)敏感?,verilog,Verilog,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 输入[3:0]m1; 注册号[3:0]m1\u r; 始终@(posedge clk)开始 m1_r=m1_r>

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
输入[3:0]m1;
注册号[3:0]m1\u r;
始终@(posedge clk)开始
m1_r=m1_r>>2//或#5 m1_r=m1_r>>2;
结束
始终@(posedge clk)开始

m1_r首先,永远不要在两个不同的
块中为单个变量赋值。这可能导致竞相条件,并在合成中造成不利影响

参考试用代码,由于一些常见原因,您不能在此处始终使用@*。这是一个组合电路,每当RHS变量改变时,其输出应改变

这里,当
m1
发生变化时,此块将值分配给NBA区域中的
m1_r
(由于非块分配)。同样,由于m1_r在NBA区域中改变,所以块第二次执行;进入活跃区域。这将在一个时间戳上永远持续下去(参见图中的反馈路径)。因此,请删除非阻塞分配或避免使用
始终@*
。我指的代码如下

  always @(*) begin
    m1_r <= m1;
    m1_r = m1_r >> 2; //or #5 m1_r = m1_r >> 2;
  end
始终@(*)开始
m1_r>2//或#5 m1_r=m1_r>>2;
结束
另一方面,使用
always@(posedge clk)
仅在灵敏度列表中包括
clk
。这将推断为触发器。
该块仅在时钟边缘执行一次。但是,这里也建议使用非阻塞分配和单个
始终
阻塞。

我认为你的问题的答案是否定的,但这实际上取决于你的驾驶方式。小延迟仅用于模拟,不可合成。将
m1\r
设置为两个进程(块)时,您试图描述什么硬件?你可以只做'm1_r=m1>>2`@摩根:我刚刚明白我上面写的模块是不正确的。它应该始终使用@(*)。谢谢我认为你的努力仍然存在问题。您在两个块中设置m1_r,无论哪种方式,您都不能这样做。你需要考虑一下你正在描述的硬件电路。@Morgan这只是我编的一个例子。我只是想弄清楚在哪种情况下应该使用@(*),哪种情况下应该使用@(posedge clk)。无所谓:)