参考书籍:《Verilog HDL 数字设计与综合》第二版,本文档为第10章的学习笔记。
本章将探讨Verilog中如何控制和定义时序
在每个独立元件的基础上进行定义,在每条语句上添加延迟#,两种建模方式:一种是将延迟赋值给独立的门;另一种是在单独的assign语句中指定延迟值。
and #10 a1(out, in1, in2); assign #10 e = a & b;
在每个独立模块的基础上定义的,将整个电路的最大延迟作用于最后的输出门延迟上。
引脚到引脚的时序说明
关键字specify和endspecify之间给路径延迟赋值,块中不能包含其他块(initial、always)等。
//引脚到引脚的延迟
specify
(a => out) = 9;
(b => out) = 9;
(c => out) = 11;
(c => out) = 11;
endspecify
用法:(
用法:(
每一个源域都要和目标域连接,因此位数可以不同。
specify
(a,b *> out) = 9;
(c,d *> out) = 11;
endspecify
(posedge clock => (out +: in))= (10:8); 上升延迟10,下降延迟8
在specify块内定义参数常量
specify
specparam d_to_q = 9;
(d => q) = d_to_q ;
endspecify
条件表达式可以包含任意逻辑操作符、位操作符等,if语句中不能使用else结构。条件路径延迟又称状态依赖路径延迟(SDPD)。
specify
if(a) (a => out) = 9;
if(a & b) (b => out) = 9;
if({c,d} == 2'b01) (c,d *> out) = 11;
endspecify
//上升延迟0->1, z->1
//下降延迟1->0, z->0
//关断延迟0->z, 1->z
specparam t-rise=9, t_fall = 13, t_turnoff = 11;
(clk => q) =(t-rise, t_fall, t_turnoff);
表达形式:“min:type:max”
specparam t-rise=8:9:10, t_fall = 12:13:14, t_turnoff = 10:11:12;
(clk => q) =(t-rise, t_fall, t_turnoff);
指定路径延迟的目的是以比门延迟更高的精度仿真实际数字电路的时序。通过系统任务:$setup , $hold , $width。所有时序检查只能用在specify块里
用来检查设计中时序元件的建立和保持约束。在时序元件(如边沿触发器)中,建立时间是数据必须在有效时钟边沿之前到达的最小时间,保持时间是数据在有效时钟边沿之后保持不变的最小时间。
//设置时间检查
//clock作为参考信号,data是被检查的信号
//如果(Tposedge_clk - Tdata) < 3,则报告违反约束
specify
$setup(data, posedge clock, 3);
endspecify
//设置时间检查
//clock作为参考信号,data是被检查的信号
//如果(Tdata - Tposedge_clk) < 5,则报告违反约束
specify
$hold(posedge clock, data, 5);
endspecify
检查脉冲宽度是否满足最小宽度要求
//设置宽度检查
//clock的上升沿正跳变作为reference_event
//clock的下一个下降沿负跳变作为data_event
//如果(Tdata - Tclk) < 6,则报告违反约束
specify
$width(posedge clock, 6);
endspecify