Verilog系列:【28】敏感信号列表中的运算
在使用Verilog进行设计时,经常会遇到这样的问题:在敏感信号列表中的信号之间可以在敏感信号列表中进行计算吗?答案是肯定的,但是这样做有可能会带来许多潜在的仿真错误。本文将以具体示例进行分析。
1.敏感信号列表前的@
该符号的作用是等待其后敏感信号列表中的信号发生变化,从而进行后续代码的执行。如果敏感信号列表中的信号没有发生变化,将一直挂起在@处。
2.敏感信号列表中的“or”
“or”并非运算符,仅是作为敏感信号列表中信号之间的分隔符,可用“,”代替。当敏感信号列表中得任意信号发生变化都会触发后续事件的执行。
3.敏感信号列表中的运算符
当敏感信号列表中中存在运算,执行的顺序是:现进行运算,再判断运算后的结果是否与之前运算的结果一致,如果一致后续事件不会被执行,反之后续事件将会执行。
【示例】
仿真结果如下:
仿真结果分析:
在1ns和3ns处,s1_var和s2_var都发生了变化,因此p1和p2后续的进程都被执行;
在4ns处,s1_var未发生变化,s2_var发生了变化,但是p2的敏感信号列表中存在运算,即“s1_var & s2_var”,该运算结果并未发生变化,所以对于敏感信号列表来说,其列表中并未发生任何变化,所以p2不会被执行。与此形成对比的是p1后续的进程被有效执行,主要是因为其中的s2_var发生了变化。
4.注意事项
· 修改组合逻辑的敏感信号列表为“@*”方式,这样当后续对应的进程中相关被读取的信号发生变化都不会导致进行挂起等待;
· 合理在敏感信号列表中使用相关运算,确定该运算为期望的结构。但是该方法强烈不推荐,建议将相关运算发在敏感信号表外,将连续赋值后结果放入敏感信号列表;
· 例如: