三防平板方案中Verilog HDL指定块
三防平板方案中两种类型的HDL结构经常用于描述结构化模型的延迟,如专用集成电路(Application Specific Integrated Circuit,ASIC)的逻辑单元。包括:
(1)分布式延迟。指定事件通过模块内的门和网络传播所需要的时间。
(2)模块路径延迟。描述从源端(input端口或inout端口)事件传播到目的端(output端口或inout端口)所需要的时间。
指定块语句用于说明源端和目的端的路径并为这些路径分配延迟。指定块的语法格式为
指定块以关键字specify和endspecify为界,并且应该出现在模块声明中。指定块可以执行以下任务:
(1)描述模块中的不同路径;
(2)为模块中的路径分配延迟;
(3)执行时序检查,以确保模块输入端所产生的事件满足模块所描述器件的时序约束。
指定块描述的路径称为模块路径,将信号源与目的配对。源可以是单向(input端口)或双向(inout端口)的。类似地,目的可以是单向(output端口)或双向(inout端口)的,并将其称为模块路径的目的。【例1.7】指定块Verilog HDL描述的例子,如代码清单1-7所示。代码清单1-7 指定块的Verilog HDL描述
跟在关键字specify后面的前两行声明指定参数。指定参数声明后面的行描述了模块路径,并为该模块路径分配延迟。指定参数确定分配给模块路径的延迟。
1、三防平板方案中模块路径声明
在指定块中设置路径延迟需要两个步骤:
(1)描述模块路径;
(2)为这些路径分配延迟。
模块路径可以描述为简单路径、边沿敏感路径或状态依赖路径。模块路径应该在指定块内定义为源信号和目的信号之间的连接。模块
路径可以连接向量和标量的任何组合。
图1.1给出了模块路径延迟。从图中可知,从不同源端口(A、B、C和D)到同一个目的端口(Q)存在不同路径延迟,因此可以为每个输入到输出的路径指定不同的延迟。
图1.1 模块路径延迟
1.三防平板方案中模块路径限制
模块路径有以下限制:
(1)模块路径源应为连接到模块input端口或inout端口的网络;
(2)模块路径目的应为连接到模块output端口或inout端口的网络或变量。
(3)在模块内,模块路径目的只能有一个驱动器。
2.三防平板方案中简单模块路径
简单路径可以使用以下其中一种方法声明:
(1)源*>目的;
(2)源=>目的。
符号*>和=>分别表示模块路径源和模块路径目的之间不同类型的连接。操作符“*”在源和目的之间建立完全连接。操作符“=>”在源和目标之间建立并行连接。【例1.8】简单模块路径声明Verilog HDL描述的例子,如代码清单1-8所示。代码清单1-8 简单模块路径声明的Verilog HDL描述
3.三防平板方案中边沿敏感路径
如果在描述一个模块路径时,在源端使用了一个边沿跳变,此时该路径称为边沿敏感路径。边沿敏感路径结构用于对输入到输出的延迟的时序建模,其只在源端信号出现指定的边沿时发生。边沿敏感路径的语法格式为
或
在该例子中,clock的任何变化,模块路径将从clcok扩展到out。
4.三防平板方案中状态依赖路径
一个依赖状态的路径是指,当一个指定条件为真时,可以为一个模块路径分配延迟,它影响通过该路径的信号传播延迟。语法格式为
从上面的语法格式可知,一个状态依赖路径描述包括以下条目:
(1)一个条件表达式,当计算结果为“真”时,使能模块路径;
(2)模块路径描述;
(3)应用于模块路径的表达式。
1)条件表达式
条件表达式中的操作数应由以下内容构成:
(1)标量或向量模块input端口或inout端口或它们位选择或部分选择;
(2)本地定义的变量或网络或它们的位选择或部分选择;
(3)编译时间常数(常数和指定参数)。
在条件表达式中可用的有效操作符如表1.3所示。
表1.3 在条件表达式中可用的有效操作符
2)简单状态依赖路径
如果状态依赖路径的路径描述是简单路径,则称为简单状态依赖路径。【例1.12】使用状态依赖路径描述XOR门时序Verilog HDL描述的例子,如代码清单1-9所示代码清单1-9 使用状态依赖路径描述XOR门时序的Verilog HDL描述
在该例子中,前两个状态依赖路径描述了当XOR门(x1)对输入变化取反时的一对输出上升和下降延迟时间。最后两个状态依赖路径描述了当XOR门缓冲变化输入的另一对输出上升和下降延迟时间。
edge_identifier可以是与输入终端描述符相关联的关键词posedge或negedge,specify_input_terminal_descriptor可以是任何input端口或inout端口。如果指定向量端口作为specify_input_terminal_descriptor,则应在最低有效位上检测边沿跳变。如果未指定边沿跳变,则应将路径看作输入端任何跳变的有效路径。
可以使用完全连接(*>)或并行连接(=>)指定边沿敏感路径。对于并行连接(=>),目的应为任何标量output或inout端口,或向量output或inout端口的位选择。对于全连接(*>),目的应为向量或标量output和inout端口中的一个或多个列表,以及向量output和inout端口中的位选择或部分选择。
data_source_expression是任意表达式,用作到路径目的的数据流描述。三防平板方案中这种任意的数据路径描述不影响数据或事件通过模型的实际传播;数据路径源处的事件如何传播到目的取决于模块的内部逻辑。polarity_operator描述数据路径是同方向还是反方向。【例1.9】带有正极性操作符边沿敏感路径声明的Verilog HDL描述的例子。
在该例子中,在clock的正边沿,模块使用10的上升延迟和8的下降延迟从clock扩展到out。数据路径是从in到out。【例1.10】带有负极性操作符边沿敏感路径声明的Verilog HDL描述的例子。
在该例子中,在clock[0]的负边沿,模块路径使用10的上升延迟和8的下降延迟从clock[0]扩展到out。数据路径是从in到out,并且in在传播到输出时取反。【例1.11】没有边沿标识符的边沿敏感路径声明的Verilog HDL描述的例子。
在该例子中,前三个路径声明声明了从操作数输入i1和i2延伸到o1输出的路径。根据操作码上输入所指定的操作,将这些路径上的延迟分配给操作。最后一个路径声明声明了从操作码输入到o1输出的路径。
3)边沿敏感状态依赖路径
如果状态依赖路径的路径描述描述了边沿敏感路径,则该状态依赖路径称为边沿敏感状态依赖路径。只要满足以下标准,就可以将不同的延迟分配给相同的边沿敏感路径:
(1)边沿、条件或两者都使每个声明唯一;
(2)端口在所有路径声明中以相同的方式引用(整个端口、位选择或部分选择)。【例1.14】边沿敏感状态依赖路径Verilog HDL描述的例子1。
在该例子中,当复位和清除为低时发生时钟的上升沿,模块路径使用10的上升和8的下降延迟从clock扩展到out。【例1.15】两个对边沿敏感路径声明Verilog HDL描述的例子,如代码清单1-11所示。
在该例子中,每个声明都有一个唯一的边沿。代码清单1-11 两个对边沿敏感路径声明的Verilog HDL描述【例1.16】边沿敏感状态依赖路径Verilog HDL描述的例子2,如代码清单1-12所示。代码清单1-12 边沿敏感状态依赖路径的Verilog HDL描述【例1.17】边沿敏感状态依赖路径Verilog HDL非法描述的例子,如代码清单1-13所示。代码清单1-13 边沿敏感状态依赖路径的Verilog HDL非法描述
该例子给出的两个状态依赖路径声明是非法的,因为即使它们有不同的条件,目的也没有以相同的方式指定,即第一个目标是部分选择,第二个是位选择。
4)ifnone条件
ifnone条件用于当用于路径的其他条件都不成立时,指定一个默认的状态依赖路径延迟。ifnone条件将指定和状态依赖模块路径相同的模块路径源端和目的端。需要遵守下面的规则:
(1)只能描述简单模块路径;
(2)对应于ifnone路径的状态依赖路径可以是简单模块路径或边沿敏感路径;
(3)如果没有到ifnone模块路径的对应状态依赖路径,则将ifnone模块路径看作一个无条件的简单模块路径;
(4)为模块路径指定ifnone条件和为同一模块路径指定无条件简单路径是非法的。【例1.18】有效状态依赖路径组合Verilog HDL描述的例子,如代码清单1-14所示。
代码清单1-14 有效状态依赖路径组合的Verilog HDL描述【例1.19】模块路径组合Verilog HDL非法描述的例子,如代码清单1-15所示。代码清单1-15 模块路径组合的Verilog HDL非法描述
该例子中的模块路径描述组合是非法的,因为它使用ifnone条件将状态依赖路径与同一模块路径的无条件路径组合在一起。
5.三防平板方案中全连接和并行连接路径
操作符*>应用于在源和目的之间建立完全连接。在完全连接中,源中的每个位都应连接到目的中的每一位。模块路径源不需要具有与模块路径目的相同的位数。
由于没有限制源信号和目的信号的位宽或数量,完全连接可以处理大多数类型的模块路径。下面的条件要求使用完全连接:
(1)一个向量和一个标量之间的一个模块路径;
(2)不同位宽向量之间的一个模块路径;
(3)在一个语句中,描述有多个源或多个目的的模块路径。
操作符“=>”用于在源和目的之间建立一个并行连接。在并行连接中,源端口的每一位将连接到目的端口的每一位。只能在包含相同位数的源和目的之间创建并行模块路径。
并行连接比全连接更加严格。它们只能是一个源和一个目的之间的连接,并且每个信号包含相同的位数。因此,一个并行连接只能用于描述两个相同位宽向量之间的一个模块路径。由于标量是一个位,所以“*>”或者“=>”都可以用于建立两个标量比特位之间的连接。
在两个4位向量之间使用全连接和并行连接的区别,如图1.2所示。
图1.2 充分连接和并行连接之间的区别不同【例1.20】宽度为8位的2:1多路复用器Verilog HDL描述的例子,如代码清单1-16所示。代码清单1-16 宽度为8位的2:1多路复用器的Verilog HDL描述
三防平板方案中从s到q的模块路径使用完全连接(*>),因为它将标量源(1位选择线)连接到向量目的(8位输出总线)。从输入线in1和in2到q的模块路径使用并行连接(=>),因为它们在两条8位总线之间建立了并行连接。6.在单个语句中声明多个模块路径
通过使用符号*>将逗号分隔的源列表连接到逗号分隔的目的列表,可以在一条语句中描述多个模块路径。当在一个语句中描述多个模块路径时,源和目的列表可能包含任意宽度的标量和向量的混合。多模块路径声明中的连接始终是完全连接。【例1.21】多个路径全连接Verilog HDL描述的例子1。
等效为:7.模块路径极性
模块路径的极性指示信号跳变的方向在从输入端传播到输出端时是否取反。这种任意极性描述不影响数据或事件通过模型的实际传播;源处的上升或下降如何传播到目的地取决于模块的内部逻辑。模块路径可以指定三种极性中的任意一种,即未知极性、正极性和负极性。
1)三防平板方案中未知极性
默认情况下,模块路径应具有未知极性;也就是说,路径源处的条件可能以不可预测的方式传播到目的地,如下所示:
(1)源处的上升可能导致目的处的上升跳变、下降跳变或无跳变。
(2)源处的下降可能导致目的处的上升跳变、下降跳变或无跳变。
指定为全连接或并联连接,但没有极性运算符+或-的模块路径应看作极性未知的模块路径。【例1.22】未知极性模块路径Verilog HDL描述的例子。
2)三防平板方案中正极性
对于具有正极性的模块路径,源处的任何跳变都可能导致目的处的相同跳变,如下所示:
(1)在源处的上升可能导致目的处的上升跳变或无跳变。
(2)在源处的下降可能导致目的处的下降跳变或无跳变。
正极性的模块路径应通过将正极性运算符指定为“=>”或“*>”的前缀。【例1.23】正极性模块路径Verilog HDL描述的例子。
3)三防平板方案中负极性
对于具有负极性的模块路径,源处的任何跳变都可能导致目的处的相反跳变,如下所示:
(1)源处的上升可能导致目的处的下降跳变或无跳变。
(2)源处的下降可能导致目的处的上升跳变或无跳变。
负极性的模块路径应通过将负极性运算符指定为“=>”或“*>”的前缀。【例1.24】负极性模块路径Verilog HDL描述的例子。