本文主要介绍HDL语言中常用的逻辑强度模型,并且以Verilog示例为主,最后介绍VHDL中常用的各种逻辑值系统.
Verilog中提供了大量的模型用于模拟具体的硬件电路,例如and,or,nmos等,同时为了更加精确的模拟具体的电路信号强弱变化情况、信号的传输、充放电等行为,依据信号的逻辑强度模型,用不同的信号强度描述信号在电路传输中的状态,用以进一步提高仿真的精确度,特别是对于分析多种驱动来源同时驱动同一线网时产生的赋值冲突问题和被驱动信号的最终属性很有帮助.这种信号强度的变化在Verilog中是用逻辑强度模型来进行模拟的,并且这种逻辑强度模型按照电平的高低主要分为两大类:strength0和strength1,这两大类的具体情况如下图和下表所示:
而strength0和strength1又可更具这些强度的用途分为两类:负荷强度(charge strength)和驱动强度(drive strength).
负荷强度:一般用于trireg声明的线网类型,类似于模拟实际电路电容的大小;
驱动强度:一般用于描述被驱动线网的强度;
在仿真设计验证的过程中,一般在没有明确限制具体取值范围时,通常使用的"0","1","Z"和"X"的取值范围如下图所示:
而经常使用的逻辑值"0","1"的强度为strong,"x"其实为一个范围,其取值可能是这个范围中的任何一个值.
【注意】
- 在缺省情况下,线网或者逻辑们的输出具有的强度为St1和St0.但是在具体建模时也可以指定不同逻辑强度,可指定输出逻辑强度的有效逻辑门如下表所示:
- 在strength1中指定highz1,例如逻辑门例化后输出为1时,实际输出为HiZ,在strength0中指定highz0,例如逻辑门例化后输出为0时,实际输出为HiZ,因为高阻态并没有一个确定的逻辑值,所以其输出显示为Z,而不是HiZ0或者HiZ1,所以(high0,high1)或者(high1,high0)的组合是无效的, ,strength1,strength1)或者(strength0,strength0)的组合也是无效的.
【示例】
仿真结果如下:
- trireg声明线网的同时可以指定其衰减时间,用以模拟电容中电荷衰减的过程.还需要注意的是,在使用一些特殊的门单元时,线网中传递的数据的强度可以在经过特定逻辑门后强度衰减.常见的信号强度衰减的情况主要有两大类:
- 信号通过非阻抗器件 当supply(Su)强度的信号通过nmos、pmos或者coms时,信号强度将衰减为strong(St); 当supply(Su)强度的信号通过tran、tranif0或者tranif1时,信号强度将衰减为strong(St);
- 信号通过阻抗器件 信号通过rnmos、rpmos、rcoms、rtran、rtranif1、rtranif0等逻辑器件后,信号强度衰减规律如下表所示: 通过对相关线网指定不同强度,可精确的模拟信号在电路中传输时信号状态的变化,为模拟不同强度信号驱动线网提供一个更加准确的描述.因此这里需要注意,一般线网可以指定特定的强度,不同的线网强度相互作用会得到不一样的结果,为了对这种现象进行描述,这里主要从以下几方面来对不同强度信号的连接进行示例说明. #信号强度的指定 在没有明确指定的情况下,一般默认的信号强度为(St1,St0),trireg的charge强度为medium(Me),tri1强度为Pu1,tri0为Pu0,supply1强度为Su1(在低功耗仿真验证时需要注意supply1的使用),supply0的强度为Su0,其中charge strength一般只用于trireg,driving strength用于下表的线网描述中:
-
- 强度声明指定的方式一般分为两种:
- 线网声明时指定强度,需要注意此时需要同时指定具体数值;
- 线网在过程性赋值时指定; 具体格式如下:
【示例】
1信号有确定强度(UAS:unambiguous strength)和数值情况 根据信号的强度、数值以及组合方式等的不同,不同信号的组合结果存在多种情况,以下将分别示例讨论. 1>sig1和sig2没有进行线逻辑操作(线与、线或等),如果sig1的信号强度比sig2的信号强度高,sig1和sig2的数值也不一样的话,那么最终的结果将由sig1决定.如果sig1和sig2的数值相同,那么最终结果的强度由sig1和sig2中强度搞得决定.
【示例】
上述电路可通过如下Verilog语句表述
:
仿真结果如下:
2>sig1和sig2进行线逻辑操作(triand,wand,trior,wor)
【示例】UAS信号sig1和sig2
进行线逻辑操作的信号的最终值由逻辑操作决定,强度由为线逻辑操作指定强度决定. #信号的强度不确定的情况(AS:ambiguous strength) 当多个信号进行组合时,因为每个信号的强度和数值一般情况下都是不一样的,所以在不同的配置属性下,其组合后结果的强度往往是一个范围.当然,如果两个信号的强度一样且数值相反,那么其组合后的结果为不定态.对于信号强度不确定的具体情况大致可分为以下几类:
1>信号有确定的数值,但属于AS;
2>信号有不定态(不定态的取值范围不定,所以不定态的强度一般有strength1和strength1的一部分共同组成);
3>信号中有低电平范围的值,且低电平范围包含高阻态; 4>信号中有高电平范围的值,且高电平范围包含高阻态;
【示例1】 组合的两个信号强度分别是weak1和weak0,两者组合后的结果为weakX
.
上述电路可通过如下Verilog语句表述如下:
仿真结果如下:
【示例2】 进行三态逻辑操作的两个信号中有一个信号为确定的状态和确定的值St1(或We0),另一个信号值为不定态,最终三态逻辑的输出为一个范围,如下图所示:
上述电路可通过如下Verilog语句表述如下:
仿真结果如下:
【示例3】来自于两个三态门的输出进行组合后,其组合后的最终输出由两部分共同决定:
上述电路可通过如下Verilog语句表述:
仿真结果如下:
MOS管操作与三三态门基本类似,如下图所示:
上述电路可通过如下Verilog语句表述:
仿真结果如下:
但是这里需要注意,如果将上图中下不得Pu0改为Su0,那么因为pmos对于supply强度有衰减作用,所以此时的低电平范围将会变为"630",当"630"和"651"进行组合后,最终的输出将为"66X",即StX.
【示例4】将上例中的三态门替换为与门,与门的一个输入为不定态,且指定与门取值的范围.例如,N1的强度范围为"St1-HIZ0",N2的强度范围为"St1-We0".因为b为不定态StX(为一个范围,St1-St0),经过与门N1后的输出的强度范围为:St1-HiZ0,即下图中的StH.因为c和d的值均为0,均有一个确定的数值和强度,所以经过与门N2后的结果为We0.N1的输出与N2的输出进行组合后的结果即为"36X".
上述电路可通过如下Verilog语句表述:
仿真结果如下:
2 AS信号与UAS 信号的组合 AS信号与UAS 信号进行组合后的最终信号状态的确定一般依据以下规则:
规则一 AS信号的强度高于UAS信号,最终组合的输出信号的强度由AS强度范围决定;
规则二 AS信号的强度小于等于UAS信号,最终组合的输出将不包含AS信号中强度小于等于UAS信号的那部分强度;
规则三如果按照上两条规则产生的结果强度中存在间隔(指UAS强度范围在AS强度范围中时),那么组合后最终的输出将包含结果中的间隔部分;
【示例1】AS信号的强度小于UAS的强度,那么结果将遵守上述规则二,所以最终的输出结果UAS的部分强度.
上述示例可通过如下Verilog语句表述:
仿真结果如下:
【示例2】AS信号强度范围为St1-We0,UAS强度为Pu1,AS信号与UAS信号组合后,AS中小于UAS的强度范围将不出现在最终的结果中,而AS中大于UAS的部分与UAS共同组成最终的结果的强度范围.
上述示例可通过如下Verilog语句表述:
仿真结果如下:
【示例3】 AS信号强度大于UAS,所以最终组合结果的强度范围为UAS到AS,如下图所示:
上述示例可通过如下Verilog语句表述:
仿真结果如下:
【示例4】AS信号通过线逻辑操作后的强度如下图所示:
上述示例可通过如下Verilog语句表述如下:
仿真结果如下:
【题外话】VHDL逻辑系统
不同的EDA工具开发了不同的逻辑系统,不同的设计团队也可能根据各自需要设计不同的逻辑组合,从而构建特殊的逻辑系统,例如:四值逻辑\七值逻辑\九值逻辑等,这里仅摘要常用的作一介绍.
说明:std_logic类型是std_ulogic类型的一个子集,相较std_logic,std_ulogic增加了一个新的逻辑值‘U‘,std_ulogic中没有指定两个std_ulogic信号连接到同一个节点上发生冲突后的逻辑值,因此需要使用该类型时,需要注意两个输出信号直接连接的情况. std_logic和std_ulogic属于仿真和综合中特别重要的数据类型,通过这两种数据类型可以精确的描述仿真电路状态.但是并不是所有的仿真中可见的数据类型都可以对应到具体的电路中,在九值逻辑中,目前普遍可被大多数EDA工具普遍认可的综合数据类型有"1","0",其他数据类型综合时需要根据特定的使用情况区分对待,所以在进行设计时,最好使用综合前后数据类型一致性较好的数值.
欢迎大家关注魏老师的微信公众号:芯光灿烂
原文地址:https://www.cnblogs.com/xgcl-wei/p/9384717.html