相关阅读
Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482
四、一般情况下的net型信号的线与组合(线网多驱动)
在Verilog基础:强度建模与net型信号的多驱动问题(二)-CSDN博客一文中,我们已经学会了多个拥有单个强度和确定值的net型信号的相与组合的规则,本文将学习更为普遍的net型信号相与的规则,首先我们说明一下一些特殊的net型信号。
一、一个net型信号拥有多个强度,和确定值(这只可能是信号线与的中间结果)。
二、一个net型信号拥有x值,它指的是net即拥有部分strength0的驱动强度也拥有部分strength1的驱动强度(这可能是信号线与的中间结果,也可能是由特定输入导致的输出x)。
三、一个信号拥有L值,它指的是net信号拥有部分strength0的驱动强度加上highz的驱动强度。
四、一个信号拥有H值,它指的是net信号拥有部分strength1的驱动强度加上highz的驱动强度。
H和L信号可以通过一些门级器件得到,比如图6是三态门器件的真值表,可以看到在某些输入情况下输出的值是H和L,在输出H和L时,其强度范围分别是从highz到strength1的某个驱动强度和从highz到strength0的某个驱动强度,这个驱动强度分别由这个门级器件的strength1和strength0驱动强度决定。
图6 三态门的真值表
上面的概念可能比较难以理解, 下面将通过一些举例来详细说明,图7给出了我们一直使用的强度比例尺。
图7 强度比例尺
例1
//一个net型信号拥有多个强度,和确定值
wire a;
bufif (strong0, strong1) (a, 1'b0, 1'bx); //StL
assign (pull0, pull1) a = 1'b0; //Pu0
//最终a的驱动强度从Pull0到Strong0,值为0,用650表示
//一个net型信号拥有x值
wire b;
assign (weak0, weak1) b = 1'bx; //Wex
//最终b的驱动强度从Weak0到Weak1,值为x,用Wex表示
wire c;
assign (strong0, strong1) c =1'b0; //St0
assign (strong0, strong1) c =1'b1; //St1
//最终c的驱动强度从Strong0到Strong1,值为x,用Stx表示
//一个net型信号拥有H值
wire d;
bufif (strong0, pull1) (d, 1'b1, 1'bx); //PuH
//最终d的驱动强度从HiZ到Pull1,值为H,用PuH表示
//一个net型信号拥有L值
wire e;
bufif (weak0, pull1) (e, 1'b0, 1'bx); //WeL
//最终e的驱动强度从HiZ到We0,值为L,用WeL表示
尽管H值和L值看似是除1、0、x、z以外的值,但其实它们只是为了方便表示一个强度范围,而且H值和L值的net信号在后续使用时会被当做x值看待,尽管它的驱动强度似乎完全在strength0或strength1的范围内,但它仍然不被看做0和1,这点在第一章便已说明。
图8表示了一个We0信号与We1信号线与后产生了Wex的结果。图9在强度比例尺上表示了结果的驱动强度范围。
wire a;
assign (weak0, weak1) a = 1'b0; //We0
assign (weak0, weak1) a = 1'b1; //We1
//最终结果是Wex
图8 相同驱动强度和相反值的信号线与
图9 Wex信号的强度范围
图10显示了两个三态器件输出H值和L值的过程。注意到输出的强度标注实际上是多余的,且不必要的,因为我们只需输入的值就可判断输出的结果值。图11和图12在强度比例尺上表示了两个结果的驱动强度范围。
wire a, b;
bufif1 (strong0, strong1) (a, 1'b1, 1'bx); //StH,驱动强度从highz到strong1
bufif0 (strong0, strong1) (b, 1'b0, 1'bx); //StL,驱动强度从highz到strong0
$display(a);
$display(b);
输出:
x
x
图10 控制端输入为x的三态门
图11 StH信号的强度范围
图12 StL信号的强度范围
下面我们来研究一个H信号与一个L信号相与的规则,我们假设两个线与的信号为PuH和WeL,如图13所示。
wire a;
bufif1 (pull0, pull1) (a, 1'b1, 1'bx); //PuH,驱动强度从highz到pull1
bufif0 (weak0, weak1) (b, 1'b0, 1'bx); //WeL,驱动强度从highz到weak0
图13 H与L信号线与
根据H的定义,我们知道PuH包含了可能的6个驱动强度(包括highz),WeL包含了可能的4个驱动强度(包括highz),按照两两组合的规则,总共有24种组合,我们要做的就是把这24种组合都考虑起来。当然,这不是让你将24中组合全部列出来,因为只需要略加观察便可知We0和We1的线与会导致结果(Wex)可能取得它们之间(包括We0和We1)任意的一种驱动强度和x值,然后PuH含有的large1和pull1也是可能取得的驱动强度,也即结果的驱动强度从We0到Pu1,值为x,表示为35x,如图14所示。
图14 35x信号的强度范围
有了上面的基础,我们可以来看一个更复杂的例子,它包含了四个驱动源,如图15所示。
wire a, b, d, out;
assign (strong0, strong1) a = 1'b1; //St1
nmos (out, a, 1'bx); //StH
pullup (out); //Pu1
pulldown (b); //Pu0
pmos (out, b, 1'bx); //StL
assign (strong0, strong1) d = 1'b0; //St0
and (weak0, weak1) (out, d, d); //We0
图15 一个拥有四个驱动源的网络
图15中包含了nmos和cmos开关,开关不能指定驱动强度但它可以传播输入的驱动强度至输出,因此其输入也必须是net类型信号,图16给出了开关的真值表。因为开关不能指定输出的驱动强度,所以开关输出信号(包括1、0、x、z、H、L)的驱动强度由输入决定。
图16 开关的真值表
由于输出out有四个驱动源,我们可以自行选择它们的相与顺序,图中是先将pullup器件和nmos的输出线与得出中间结果,pullup器件输出的是Pu1,包含了单个驱动强度,而nmos器件根据规则,输出的是StH,包含了可能的7个驱动强度(包括highz)。它们组合应该有7种情况,但经过观察可知Pu1优先于StH中小于Pu1强度的驱动强度,而StH中含有的St1也是可能的驱动强度,因为它优于Pu1,因此中间结果的驱动强度从Pu1到St1,值为1,表示为651,如图17所示。随后将pulldown器件和pmos的输出线与得出中间结果530,如图18所示,具体过程在此不赘述。
图17 一个拥有确定值和多个驱动强度的中间信号651的强度范围
图18 一个拥有确定值和多个驱动强度的中间信号530的强度范围
最后需要考虑两个中间结果651和530的线与过程,651信号拥有2个驱动强度而530信号拥有3个驱动强度。它们组合应该有6种情况,经过观察可知,651信号中的Pu1驱动强度与530信号中的Pu0信号线与结果是Pux,再加上651信号中的St1即为所有可能的驱动强度结果,其他的组合情况都被包含在上面两种结果中,所以不需要再讨论了,因此结果为驱动强度从Pu0到St1的,值为x的信号,表示为56x,如图19所示,其中5代表在stength0中的强度,6代表在strength1中的强度。
图19 56x信号的强度范围
我们再来看一个例子,它展示了广义的StH所包含的驱动强度范围。图20很好理解,两个门的输出信号分别为StH与We0,随后将其线与。
wire e;
and N1 (highz0, strong1) (e, 1'b1, 1'bx); //06x?StH!
and N2 (strong1, weak0) (e, 1'b0, 1'b0); //We0
图20 广义的StH
按照之前的说法,N1的输出应该是06x,即强度从highz0到strong1的值为x的信号,但实际上结果是StH,因为我们一般不将highz0和highz1进行区分,统称为highz,所以061和06x其实都会被表示成StH,而它们本身并不存在。
图21显示了N1输出结果StH的驱动强度范围,注意其中包含了highz0。
图21 广义StH信号的强度范围
我们可以很轻松地得出出N2输出信号的强度We0,因为其只有单个强度,如图22所示。
图22 We0信号的强度范围
现在将We0信号和广义StH信号线与,如果有了之前的基础,很快就可以得出结果为36x,因为We0与广义StH信号中的We1相与可以得到Wex,然后再加上广义StH信号中的La1、Pu1、St1即可构成所有驱动强度范围,如图23所示。
图23 36x信号的强度范围
下面留4道习题用于检验本章的学习成果,如有任何疑问,可以私聊博主或在评论区发言。