VERILOG 学习 第10章完稿.docx
- 文档编号:9221104
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:21
- 大小:98.52KB
VERILOG 学习 第10章完稿.docx
《VERILOG 学习 第10章完稿.docx》由会员分享,可在线阅读,更多相关《VERILOG 学习 第10章完稿.docx(21页珍藏版)》请在冰豆网上搜索。
VERILOG学习第10章完稿
第二部分高级Verilog主题
10时序和延迟
分布延迟、集总延迟和引脚到引脚延迟,specify块,并行连接和全连接,时序检查,延迟反标。
11开关级建模
MOS和CMOS开关,双向开关,电源和地的建模,阻性开关,开关的延迟说明。
12用户自定义原语(UDP)
UDP定义的组成部分,UDP规则,表示组合逻辑的UDP,表示时序逻辑的UDP,缩写符号。
13编程语言接口(PLI)
PLI的介绍,PLI的使用,PLI任务的连接和调用,设计的概念表示,PLI存取子程序和使用子程序。
14VerilogHDL的逻辑综合
逻辑综合的介绍,逻辑综合对电路的影响,适用于逻辑综合的VerilogHDL结构和操作符,综合设计的流程,综合产生电路的验证,建模的技巧,设计的划分。
15高级验证技术
简单验证流程的介绍,结构化建模,测试向量/测试平台,仿真加速,硬件仿真,分析/覆盖率,断言检查,形式化验证,半形式化验证,等价性检查。
第十章时序和延迟
----------------------------------------------------
硬件的功能验证用于验证所设计的电路的功能。
但是,真实硬件中的模块具有逻辑元件和它们之间的路径带来的延迟。
因此,必须检查电路是否满足延迟说明中指定的模块时序约束。
随着电路尺寸变得越来越小且速度越来越快,检查时序约束变得越来越重要了。
检查时序的方式之一是进行时序仿真,即在仿真过程中计算与该模块相关的延迟值。
与时序仿真不同的另一种验证时序的技术在设计自动化行业中已经出现。
最流行的技术是静态时序验证。
设计者首先进行纯功能验证,然后用静态时序验证工具单独验证时序。
静态验证的主要优点是它能以比时序仿真快几个数量级的速度验证时序。
静态时序验证是一个独立的研究领域,本书不作讨论。
本章我们将详细讨论在Verilog模块中如何控制和定义时序和延迟。
因此,通过使用时序仿真,设计者可以同时验证Verilog描述的电路的功能和时序。
学习目标:
1)鉴别Verilog仿真中用到的延迟模型的类型,分布延迟、集总(lumped)延迟和引脚到引脚(路径)的延迟;
2)理解如何在仿真过程中用specify块设置路径延迟;
3)能解释输入和输出管脚之间的并行连接和全连接;
4)理解如何在specify块中用specparam语句定义参数;
5)描述状态依赖路径延迟,即条件路径延迟;
6)能解释rise、fall和turn-off延迟,理解如何设置min、max和typ的值;
7)能够为时序检查定义系统任务,$setup、$hold和$width;
8)理解延迟反标。
10.1延迟模型的类型
在Verilog中有三种类型的延迟模型:
分布的延迟、集总的延迟和引脚到引脚(路径)的延迟。
10.1.1分布的延迟
分布的延迟是在每个独立元件的基础上进行定义的。
延迟值赋给电路中独立的元件。
图10-1显示了模块M中分布在每个逻辑元件上的延迟。
分布的延迟可以通过两种方式建模:
一种是将延迟值赋给独立的门;另一种是在单独的assign语句中指定延迟值。
任意一个门的输入发生变化时,该门的输出在指定的延迟值后改变。
例10-1显示出如何在门元件中和数据流描述中说明分布的延迟。
例10-1分布的延迟
//门级模块中的分布的延迟
moduleM(out,a,b,c,d);
outputout;
inputa,b,c,d;
wiree,f;
//每个门的分布的延迟
and#5a1(e,a,b);
and#7a2(f,c,d);
and#4a3(out,e,f);
endmodule
//数据流定义中的分布的延迟
moduleM1(out,a,b,c,d);
outputout;
inputa,b,c,d;
wiree,f;
//每个表达式中的分布的延迟
assign#5e=a&b;
assign#7f=c&d;
assign#4out=e&f;
endmodule
分布的延迟提供详细的延迟建模方式。
电路中每个元件的延迟都要指定。
10.1.2集总的延迟
集总的延迟是在每个独立模块的基础上定义的。
它们可以看作是模块输出门的单个延迟,而实际上是将所有路径累积的延迟汇总于输出门这一处,因此称为集总延迟。
图10-2和例10-2中给出了集总的延迟的示例。
前一个示例是图10-1的改进。
本例中,我们计算图10-1中从任意输入到输出的最大延迟,即,7+4=11个单位延迟。
整个延迟汇总到输出门。
当模块M的任意输入发边变化时,经过这个最大延迟之后,输出发生改变。
例10-2集总的延迟
//集总的延迟
moduleM(out,a,b,c,d);
outputout;
inputa,b,c,d;
wiree,f;
anda1(e,a,b);
anda2(f,c,d);
and#11a3(out,e,f);//延迟只在输出门处
endmodule
集总的延迟模型与分布的延迟相比更易于建模。
10.1.3引脚到引脚之间的延迟
另一种对模块的延迟定义方式是引脚到引脚的时序说明。
分别把延迟赋给模块中从每个输入到每个输出之间的所有路径。
因此,可以针对每条输入/输出路径分别指定延迟。
在图10-3中采用图10-1中的示例并给每条输入/输出路径计算引脚到引脚延迟。
可以从数据手册中直接获取标准组件的引脚到引脚延迟。
通过用SPICE那样的低层次仿真器进行电路描述的仿真,可以获得数字电路模块的引脚到引脚延迟。
虽然引脚到引脚延迟非常详细,但是对大规模电路而言,它比分布的延迟更容易建模,因为写延迟模型的设计者只需了解模块的输入/输出管脚而无需了解模块的内部。
模块内部可以用逻辑门、数据流、行为级语句,或混合的方式来设计,但是引脚到引脚的延迟说明仍然保持不变。
引脚到引脚的延迟也被称为路径延迟。
后续章节中将使用“路径延迟”这个术语。
在5.2节(门延迟)和6.2节(延迟)中,我们已经讨论了分布的和集总的延迟。
下一节将详细研究路径延迟。
10.2路径延迟建模
本节探讨路径延迟建模的各个方面。
本节中,术语管脚和端口可以互相替代使用。
10.2.1Specify块
在模块源(输入或输入输出)管脚和目标(输出或输入输出)管脚之间的延迟称为模块路径延迟。
Verilog中,在关键字specify和endspecify之间给路径延迟赋值,关键字之间的语句组成specify块(即指定块)。
Specify块包含下列操作语句:
●给穿过模块的所有路径指定引脚到引脚的时序延迟;
●在电路中设置时序检查;
●定义specparam常量。
对于图10-3中的示例,我们可以用例10-3中所示的specify模块来描述模块M的引脚到引脚的延迟:
例10-3引脚到引脚的延迟
//引脚到引脚的延迟
moduleM(out,a,b,c,d);
outputout;
inputa,b,c,d;
wiree,f;
//包含路径延迟语句的Specify块
specify
(a=>out)=9;
(b=>out)=9;
(c=>out)=11;
(d=>out)=11;
endspecify
//门的实例调用
anda1(e,a,b);
anda2(f,c,d);
anda3(out,e,f);
endmodule
Specify块是模块中的一个独立部分,且不在任何其它块如initial或always内出现。
Specify块中的语句含义必须非常明确。
10.2.2Specify块内部
本节中,我们描述那些可以用在specify块内部的语句。
并行连接
如前所述,每条路径延迟语句都有一个源域和一个目标域。
在例10-3的路径延迟语句中,a、b、c和d在源域位置,而out是目标域。
用符号=>说明并行连接,用法如下所示。
用法:
(
并行连接中,源域中每位与目标域中相应的位连接。
如果源和目标域是向量,必须有相同的位数;否则会出现不匹配。
因此,并行连接说明了源域的每一位到目标域的每一位之间的延迟。
图10-4显示出源域和目标域之间的位是如何并行连接的。
例10-4给出并行连接的Verilog描述。
例10-4并行连接
//位对位连接。
a和out都是位宽为1的信号
(a=>out)=9;
//矢量对矢量的连接。
a和out都是位宽为4的信号:
a[3:
0],out[3:
0]
//a是源信号,out是目标信号
(a=>out)=9;
//上面这条语句实际上是下面四条位对位连接语句的缩写
(a[0]=>out[0])=9;
(a[1]=>out[1])=9;
(a[2]=>out[2])=9;
(a[3]=>out[3])=9;
//非法连接。
a[4:
0]是位宽为5的矢量,而out[3:
0]是位宽为4的矢量
//源域与目标域的位宽不匹配
(a=>out)=9;//位宽不匹配
全连接
用符号*〉说明全连接,用法如下所示。
用法:
(
在全连接中,源域的每一位与目标域中的每一位相连接。
如果源和目标是向量,则它们不须位数相同。
全连接描述源的每一位和目标中每一位之间的延迟,如图10-5所示。
例10-3中用并行连接描述模块M中的延迟。
例10-5表示如何用全连接定义延迟。
例10-5全连接
//全连接
moduleM(out,a,b,c,d);
outputout;
inputa,b,c,d;
wiree,f;
//全连接
specify
(a,b*>out)=9;
(c,d*>out)=11;
endspecify
anda1(e,a,b);
anda2(f,c,d);
anda3(out,e,f);
endmodule
当向量位宽很大时,全连接在定义输入向量中每一位与输出向量中每一位之间的延迟时尤其有用。
前提是这些延迟的值必须一致。
下例展示全连接怎样非常精确地指定延迟。
//a[31:
0]是32位宽的矢量,out[15:
0]是16位宽的矢量
//a的每一位与out每一位之间的延迟为9
specify
(a*>out)=9;//需要用32x16=352条并行连接语句来完成此条语句的功能!
//想一想,为什么?
endspecify
边沿敏感路径
边沿敏感路径用于输入到输出延迟的时序建模,这种结构仅当源信号上出现特定边沿时才有用。
//本例中,在时钟信号clock的正跳变沿时刻,从时钟信号到输出信号用去上升延迟
//10,下降延迟8。
数据路径是从in到out,输入信号in没有反相就传送到out输出
(posedgeclock=>(out+:
in))=(10:
8);
Specparam声明语句
可以声明特殊的参数,以便用在specify模块中。
它们用specparam关键字声明。
替代直接使用数值定义引脚到引脚延迟的方式,一般用specparam定义specify参数,然后在specify块中使用这些参数。
specparam的值常常用于给非仿真工具存储值,例如延迟计算器、综合工具和版图评估器。
例10-6中展示了一个的使用specparam语句的specify块示例。
例10-6specparam声明语句
//用指定参数语句指定延迟参数
specify
//在指定块内部定义参数
specparamd_to_q=9;
specparamclk_to_q=11;
(d=>q)=d_to_q;
(clk=>q)=clk_to_q;
endspecify
注意,specify参数仅用在它们自己的specify块内部。
它们不是用关键字parameter声明的全局参数。
提供specify参数是为了方便给延迟赋值。
建议用specify参数而不是数值表示引脚到引脚的延迟值。
因此如果电路的时序说明变了,用户只需改变specify参数值,而不必逐个修改每条路经的延迟值。
条件路径延迟
引脚到引脚延迟可能会根据电路输入信号的状态而改变。
Verilog允许根据电路中根据信号值有条件地给路径延迟赋值。
条件路径延迟用if条件语句表示。
操作数可以是后面列出的这些量的标量或向量值:
模块输入或输出端口、或者它们的位选或域选、或者局部定义的寄存器或网表或它们的位选或域选,或者编译时就能确定的常量(常数和specify块参数)。
条件表达式可以包含任意逻辑操作符、位操作符、缩减操作符、连接操作符以及条件操作符,如96页表6-1所示。
if语句不能使用else结构。
条件路径延迟也叫做状态依赖路径延迟(SDPD)。
例10-7条件路径延迟
//条件路径延迟
moduleM(out,a,b,c,d);
outputout;
inputa,b,c,d;
wiree,f;
//有条件的引脚至引脚的延迟时序
specify
//基于信号a的状态而不同的引脚到引脚的延迟
if(a)(a=>out)=9;
if(~a)(a=>out)=10;
//条件表达式包含两个信号b,c.
//若b与c为真,延迟delay=9,
//否则延迟delay=13.
if(b&c)(b=>out)=9;
if(~(b&c))(b=>out)=13;
//用拼接操作符
if({c,d}==2'b01)
(c,d*>out)=11;
if({c,d}!
=2'b01)
(c,d*>out)=13;
endspecify
anda1(e,a,b);
anda2(f,c,d);
anda3(out,e,f);
endmodule
上升、下降和关断延迟
引脚到引脚的时序也可以通过指定上升、下降和关断(turn-off)延迟值来更详细地表示(见例10-8)。
可以给任意路径定义一个、二个、三个、六个或十二个延迟值。
四个、五个、七个、八个、九个、十个或十一个延迟值都是错误的。
必须严格按顺序定义这些延迟。
在5.2.1节上升、下降和关断延迟中,探讨了逻辑门的上升、下降和关断延迟的说明方法。
在本节将在引脚到引脚的时序说明中继续讨论这些延迟。
例10-8用上升、下降和关断值指定的路径延迟
//对于所有的过渡过程(上升、下降和关断),只指定一个延迟参数
specparamt_delay=11;
(clk=>q)=t_delay;
//指定两个延迟参数,上升和下降
//用于上升的过渡过程0->1,0->z,z->1
//用于下降的过渡过程1->0,1->z,z->0
specparamt_rise=9,t_fall=13;
(clk=>q)=(t_rise,t_fall);
//指定三个延迟参数,上升、下降和关断
//用于上升的过渡过程0->1,z->1
//用于下降的过渡过程1->0,z->0
//用于关断的过渡过程0->z,1->z
specparamt_rise=9,t_fall=13,t_turnoff=11;
(clk=>q)=(t_rise,t_fall,t_turnoff);
//指定六个延迟参数
//按照以下次序指定延迟:
//0->1,1->0,0->z,z->1,1->z,z->0
specparamt_01=9,t_10=13,t_0z=11;
specparamt_z1=9,t_1z=11,t_z0=13;
(clk=>q)=(t_01,t_10,t_0z,t_z1,t_1z,t_z0);
//指定十二个延迟参数
//按照以下次序指定延迟:
//0->1,1->0,0->z,z->1,1->z,z->0
//0->x,x->1,1->x,x->0,x->z,z->x
//必须严格按照以上次序指定延迟参数
specparamt_01=9,t_10=13,t_0z=11;
specparamt_z1=9,t_1z=11,t_z0=13;
specparamt_0x=4,t_x1=13,t_1x=5;
specparamt_x0=9,t_xz=11,t_zx=7;
(clk=>q)=(t_01,t_10,t_0z,t_z1,t_1z,t_z0,
t_0x,t_x1,t_1x,t_x0,t_xz,t_zx);
最小、最大和典型延迟
早在5.2.2节最小/典型/最大值中就探讨了逻辑门的最小、最大和典型延迟值。
最小、最大和典型延迟值也可以用于说明引脚到引脚的延迟。
例10-8中的任意延迟值都可以用最小、最大和典型延迟形式表示。
考虑例10-9中所示的三种延迟值的说明方式。
每一个延迟都用最小:
典型:
最大延迟形式表示。
例10-9用最小、最大和典型延迟值表示的路径延迟
//指定三个延迟参数,上升、下降和关断
//每个延迟具有最小、典型和最大值
specparamt_rise=8:
9:
10,t_fall=12:
13:
14,t_turnoff=10:
11:
12;
(clk=>q)=(t_rise,t_fall,t_turnoff);
在前面的阐述中,最小、典型和最大值可以在Verilog命令行用运行选项+mindelays、+typdelays以及+maxdelays的方式调用。
缺省值是典型延迟值。
仿真器不同,调用方式也可能不同。
处理x状态转换
Verilog采用保守的方法计算x状态转换的延迟。
如果没有显式地指定x转换的延迟,则保守方法规定:
●从x到已知状态的转换应当消耗可能的最大时间;
●从已知状态到x的转换应当消耗可能的最小时间。
从例10-8中摘录的六个延迟的路径延迟说明如下所示。
//指定六个延迟参数
//按照以下次序指定延迟:
//0->1,1->0,0->z,z->1,1->z,z->0
specparamt_01=9,t_10=13,t_0z=11;
specparamt_z1=9,t_1z=11,t_z0=13;
(clk=>q)=(t_01,t_10,t_0z,t_z1,t_1z,t_z0);
上述延迟说明中的x转换的计算方法如下表所示:
过渡过程
延迟值
0->x
min(t_01,t_0z)=9
1->x
min(t_10,t_1z)=11
z->x
min(t_z0,t_z1)=9
x->0
min(t_10,t_z0)=13
x->1
min(t_01,t_z1)=9
x->z
min(t_1z,t_0z)=11
10.3时序检查
本章前几节讨论了如何指定路径延迟。
指定路径延迟的目的是以比门延迟更高的精度仿真实际数字电路的时序。
本节将描述如何建立时序检查以便查看仿真过程中是否违反了时序约束。
对于时序严格的高速时序电路如微处理器,时序验证尤其重要。
Verilog提供了系统任务来进行时序检查。
Verilog有很多用于时序检查的系统任务。
我们将探讨三种最通用的时序检查任务:
$setup、$hold和$width。
所有的时序检查只能用在specify模块里。
为了简化讨论省略了这些时序检查系统任务的一些可选参数。
10.3.1$setup和$hold检查
$setup和$hold任务用来检查设计中时序元件的建立和保持约束。
在时序元件如边沿触发的触发器中,建立时间是数据必须在有效时钟边沿之前到达的最小时间。
保持时间是数据在有效时钟边沿之后保持不变的最小时间。
建立和保持时间如图10-6所示。
$setup任务
建立时间检查可以用系统任务$setup进行。
用法:
$setup(data_event,reference_event,limit);
data_event被检查的信号,检查它是否违反约束
reference_event用于检查data_event信号的参考信号
limitdata_event需要的最小建立时间
如果(Treference_event-Tdata_event) Setup检查的示例如下所示。 //设置建立时间检查 //clock作为参考信号 //data是被检查的信号 //如果(Tposedge_clk-Tdata)<3,则报告违反约束 specify $setup(data,posedgeclock,3); endspecify $hold任务 保持时间检查可以用系统任务$hold进行。 用法: $hold(reference_event,data_event,limit); reference_event用于检查data_event信号的参考信号 data_event被检查的信号,检查它是否违反约束 limitdata_event需要的最小保持时间 如果(Tdata_event–Treference_event) 保持时间检查的示例如下所示。 //设置保持时间检查 //clock作为参考信号 //data是被检查的信号 //如果(Tdata-Tposedge_clk)<5,则报告违反约束 specify $hold(posedgeclock,data,5); endspecify 10.3.2$width检查 有时有必要检查脉冲宽度。 系统任务$width用来检查脉冲宽度是否满足最小宽度要求。 用法: $hold(reference_event,limit); reference_event边沿触发事件(信号的边沿跳变) limit脉冲最小宽度 不给$width显式指定data_event,它是reference_event信号的下一个反向跳变沿。 因此,$width任务检查信号值一个跳变到下一个反向跳变之间的时间。 如果(Tdata_event–Treference_event) //设置宽度检查 //cloc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VERILOG 学习 第10章完稿 10 完稿