only 发表于 2010-5-18 15:36:40

Verilog中always电平敏感信号列表的一点问题

下面一段文章的描述谁是正确呢?网上搜索了一下没找到正确答案。
下面内容来自某作者博客,他认为错误的这句话在夏宇闻老师教材中也是这样说的。若此人观点是正确的话,是否可以这样认为:
always实现组合逻辑,敏感列表不完整或者多余时只是在仿真时会出现问题,综合布局部线后eda工具会默认将所有always过程中的输入信号和条件判断语句作为触发信号,增减敏感信号列表中的信号不会对最终的执行结果产生影响。

----------------------------------------------------------------------------------
组合逻辑电路的设计,在谈到always电平敏感信号列表时,网上有的说:



    在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。



这句话是错的!而事实的真相应该是这段话:


敏感信号列表出现在always块中,其典型行为级的含义为:只要敏感信号列表内的信号发生电平变化,则always模块中的语句就执行一次,因此设计人员必须将所有的输入信号和条件判断信号都列在信号列表中。有时不完整的信号列表会造成不同的仿真和综合结果,因此需要保证敏感信号的完备性。在实际的PLD 器件开发中,EDA 工具都会默认将所有的输入信号和条件判断语句作为触发信号,增减敏感信号列表中的信号不会对最终的执行结果产生影响,因此如果期望在设计中通过修改敏感信号来得到不同的逻辑,那就大错特错了。当敏感信号不完备时,会使得仿真结果不一样,这是因为仿真器在工作时不会自动补充敏感信号表。如果缺少信号,则无法触发和该信号相关的仿真进程,也就得不到正确的仿真结果。


必须将所有的输入信号和条件判断信号都列在信号列表中

有一种输入方式是:

always@(*)

begin

       ....

end

此时,综合工具和仿真工具会自动将所有的敏感信号自动加入敏感信号列表。

eworker 发表于 2010-5-18 15:40:07

关注

ngzhang 发表于 2010-5-18 17:21:22

always@(*)
是verilog2001标准里新添加的特性。现在的综合器基本都支持了。因此只要这样写就好了。

minux 发表于 2010-5-18 17:24:14

理论上是的,对于组合逻辑,敏感信号主要是用于仿真的。

如果想偷懒,就用always @(*)吧。或者干脆用有自动补全敏感信号列表功能的编辑器(比如emacs/Vim)。

only 发表于 2010-5-18 22:13:27

了解,谢谢以上各位答复。

tear086 发表于 2010-5-18 23:02:14

always @(*)
always @*
有括号没括号;有空格没空格都行。

only 发表于 2010-5-19 06:29:36

回复【5楼】tear086.COM 缺氧
always @(*)
always @*
有括号没括号;有空格没空格都行。
-----------------------------------------------------------------------

其实我不是问的always @(*) 问题,呵呵,不过这个对新手应该听迷惑的,google一下就可以得到答案了。现在正在研究一些always敏感电平,FSM,modelsim仿真的问题,不过都是工作之余在搞,进展稍微缓慢一点,后面会写点简单程序仿一下。

akuei2 发表于 2010-5-19 07:43:45

这样的语法也有..................

gyhg1206 发表于 2010-5-31 22:07:10

不全及其有可能会产生latch的

liu_xf 发表于 2010-6-11 15:15:55

“敏感列表不完整或者多余时只是在仿真时会出现问题,综合布局部线后eda工具会默认将所有always过程中的输入信号和条件判断语句作为触发信号,增减敏感信号列表中的信号不会对最终的执行结果产生影响。 ”

Example1:
input a,b,c;
reg e,d;
always @(a or b or c)
begin
e=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变
化*/
d=e |c;
end
Example2:
input a,b,c;
reg e,d;
always @(a or b or c or d)
begin
e=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/
d=e |c;
end

ITBoy000 发表于 2011-12-30 13:45:52

似乎有点懂了!

submars 发表于 2012-1-8 18:43:08

mark

tyut_yun 发表于 2012-1-8 20:28:46

了解了解。

wiisir 发表于 2012-1-9 15:33:27

如果是异步信号也要出现在always列表中。
如:
always @(posedge CLK or negedge CLR)
begin
    if (~CLR)
      Q <=0;
    else
      Q <=D;
end

上面如果没有negedge CLR,D触发器中就没有异步清零端CLR

medea 发表于 2012-1-12 20:29:47

下午看书读到了lz帖子中的第一段描述,刚好学习下~谢谢大家了

pktzj117 发表于 2014-2-28 14:05:51

学习了 感谢   !{:lol:}

Smartist 发表于 2014-3-6 13:30:55

看看~~~~~~~~~~~~~~~~~~~~~··

wuzhen_71 发表于 2014-7-8 16:10:49

minux 发表于 2010-5-18 17:24
理论上是的,对于组合逻辑,敏感信号主要是用于仿真的。

如果想偷懒,就用always @(*)吧。或者干脆用有自 ...

给赞一个

wuzhen_71 发表于 2014-7-8 16:11:25

说得好!好,好,好,好,好!
页: [1]
查看完整版本: Verilog中always电平敏感信号列表的一点问题