verilog设计知识集合(2)
1、阻塞与非阻塞
阻塞赋值是存在先后关系的,非阻塞是不存在先后关系的。一般而言,阻塞用于组合逻辑,非阻塞用于时序逻辑(不一定)。阻塞的执行时逐步赋值,非阻塞是同步赋值。
阻塞和C中的赋值语句功能是一致的。为何会存在非阻塞赋值呢?这里主要考虑的是寄存器的状态包含现状态和下一状态,这使得硬件电路存在一个变量赋值给另外一个变量时还可以将其他变量赋值给它的操作,这和存储器的工作方式不大一样。显然,这种赋值方法更加高效且匹配寄存器。所以,非阻塞赋值也就有了应用场景了。
model fbosc1(y1, y2, clk, rst); output y1, y2; input clk, rst; reg y1, y2; always @ (posedge clk or posedge rst) if (rst) y1 = 0; else y1 = y2; always @ (posedge clk or posedge rst) if (rst) y2 = 1; else y2 = y1; endmodule
摘录一个反馈振荡器的工作来说明其工作的方式。这里使用的是阻塞赋值,在rst到达always块时,信号阻塞赋值,哪个先到先执行哪一个。换言之,这个时候存在因延时导致输出不同的亚稳态。
2、隐藏的锁存器
如果使用电平触发,而电平敏感源不能包括所有变化信号,则可能形成锁存器(也可能是冗余逻辑)。在前面的数字电路之MOS设计中粗略的介绍了锁存器的作用。一般而言,不使用锁存器加入设计,除非掌握了相应的设计方法。
3、赋值语句的特点
always块并行处理,所以不能在不同的always块中对同一变量赋值,构成时序冲突。
(小技巧:可以通过对某一变量赋值'bx,这时就会解释为无关变量,得到最简洁的电路)
4、基本编程要点
1️⃣时序电路采用非阻塞赋值2️⃣锁存器使用非阻塞3️⃣always建模组合逻辑时采用阻塞逻辑(这一点和习惯不同,注意区分,虽然单条语句没有区别,但是多条语句是存在区别的)。
4️⃣不要混用5️⃣$strobe显示阻塞赋值语句的值,$display显示非阻塞语句的值
5、同步设计的几个
1️⃣所有数据通过组合逻辑和触发器2️⃣延时由同步延时单元控制3️⃣组合逻辑不能形成自反馈4️⃣时钟不能门控5️⃣数据信号必须通向组合或者延时单元
总之,不能违背数字电路的基本要求。
6、竞争条件
由于延时导致输出竞争的现象,一般出现在延时单元。比如clk和rst接在一起,两者都是边沿触发(异步复位),这是就存在信号由于always内部延时产生不同的结果的现象。
7、门电路延时
使用门电路产生脉冲,这是数字电路中常用的方法。采用一个双反相器做成的延时加上一个逻辑门即可。不过现在一般采用PLL生成不同的频率时钟。这种脉冲使用较少。
8、违背建立时间和保持时间
违背建立时间,时钟频率需要放缓;违背保持时间,信号需要加入buff缓冲。
9、脉冲毛刺
这个在数字电路中比较常见了,毛刺一般来自于逻辑门的延时,消除方法就是使用寄存器同步一下。
10、门控时钟的危害
门控时钟的主要缺点是将逻辑门延时带入时钟信号,会打乱其他寄存器与门控时钟驱动的寄存器的相对延时,造成某些数据的丢失。
11、异步信号的亚稳定
一般来说,异步信号的采集由于不能喝同步信号保持确认的关系,容易产生亚稳态(即采集的信号失败)和建立保持时间失效的现象。
12、可以使用的异步信号
异步复位信号rst。