赋值条件未完全指定推断出锁存器,为何依赖时钟电平?无时钟时如何判断敏感电平?
Verilog锁存器推断的常见疑问解答
先纠正一个关键误解
你举的这个例子里推断出的是电平敏感透明锁存器,它根本不依赖外部时钟信号——你大概率是把锁存器和边沿触发器的特性搞混了。只有边沿触发器才需要时钟边沿触发,而电平锁存器的行为完全由代码里的控制信号电平决定,和时钟没关系。
你的示例代码到底在干什么?
看这段代码:
always @* if (in) q=d;
- 当
in是高电平时,q会实时跟着d变(这时候锁存器是“透明”的,相当于直通); - 当
in是低电平时,q会死死保持之前的数值,不管d怎么变——这就是锁存器的“保持”功能。
这里的控制信号是in,不是什么时钟,代码里没时钟,这个锁存器也不需要时钟。
为啥会觉得它依赖时钟?
多半是把锁存器和触发器搞混了:
- 边沿触发器(比如常用的D触发器)得用
always @(posedge clk)这种时钟触发的块来写,输出只在时钟的上升/下降沿更新; - 而电平锁存器是在组合逻辑块(
always @*)里,因为赋值条件没写全(比如没写else分支)才推断出来的,它的控制信号是代码里的条件变量,不是时钟。
怎么判断锁存器对哪种电平敏感?
看控制信号的有效条件:
- 你写的
if (in),意思是in高电平的时候锁存器透明,低电平保持,所以这是高电平敏感的锁存器; - 如果改成
if (!in) q=d;,那就是低电平敏感——in低电平时直通,高电平时保持数值。
内容的提问来源于stack exchange,提问作者Dzx
相关产品推荐
相关产品推荐

