verilog - Verilog 始终@* 敏感度列表中包含哪些内容?

标签 verilog system-verilog digital-logic

当您在 always block 敏感度列表中使用通配符 @* 时,我对什么被视为输入有点困惑。例如,在下面的示例中,哪些信号被解释为导致 always block 被重新评估的输入?

据我了解,clkreset不包括在内,因为它们不会出现在always中任何程序语句的右侧 block 。包含 ab 是因为它们都出现在 always block 中过程语句的右侧。

但是,我真正困惑的是enmux。因为它们在 ifcase 语句中用作测试条件,所以它们是否被视为输入?每次 enmux 更改值时,是否会重新评估 always block ?

module example
( 
    input wire clk, reset, en, a, b,
    input wire [1:0] mux,
    output reg x,y, z
);

always @*    
begin  
 x = a & b;    
  if (en)
    y= a | b;
  case(mux)
    2'b00: z = 0;
    2'b01: z = 1;
    2'b10: z = 1;
    2'b11: z = 0;
  endcase
end
endmodule

最佳答案

在 block 内读取的任何信号,如果其值发生变化,可能会导致 block 的结果发生变化,将包含在 @* 中。使用的读取信号的任何更改都必须导致模块重新评估,因为它可能导致模块的输出发生变化。我相信您知道,如果您没有使用 @*,您将手动列出这些信号。

对于您提供的代码,它是任何信号:

  • 在作业的右侧进行评估(ab)
  • 作为条件条件的一部分进行评估(enmux)

...但它是出于任何原因都会被评估的任何信号。 (我现在想不出任何其他原因,但也许其他人可以)

clkreset 不在敏感度列表中,因为它们未被使用。就那么简单。他们没有什么特别之处;它们和其他信号一样。

关于verilog - Verilog 始终@* 敏感度列表中包含哪些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9659038/

相关文章:

chisel - 如何使用bundle/vec输入测试模块?

c - 在 C 中合并数组中的位变量

algorithm - 在 Verilog 中拆分位数组

python - 线性反馈移位寄存器?

system-verilog - 在 systemverilog 中,有没有办法以类型为条件?

verilog - 如何使用UVM工厂的set_inst_override_by_name来覆盖序列项

embedded - I2C 主站到主站通信是否可行?

verilog - 警告 : (vsim-7) Failed to open readmem file "mem_content_01.dat" in read mode

parameters - 是否可以通过 Verilog/SystemVerilog 中的模块层次结构向上传递常量参数?

verilog - ","和always@中的 "or"有什么区别?