数字会提供以下仿真文件(示例):
Simulation Files | Description |
---|---|
/BIN_SCAN/dbg_master_scan.v | 最基本的dbg_master,导入到cadence, |
/BIN_SCAN/scan_task.v | 被dbg_master调用的task |
/BIN_SCAN/stimulus.v | SCAN仿真的激励 |
/BIN_SCAN/scan_sdin_input.txt | SCAN输入数据 |
/BIN_SCAN/scan_drdy_output.txt | 预期SCAN输出数据,用于与真实仿真输出XOR |
数字同时提供以下网表文件(示例)
Netlist Files | Description |
---|---|
/NETLIST/xxx_dig_top_enc.v | 数字门级网表 |
/NETLIST/tcb018bcdgp2a.v | VERILOG形式的数字标准单元库 |
/NETLIST/xxx_dig_top_tc.sdf | 记录延迟信息的SDF反标文件 |
最简单的,是直接在cadence中GUI界面仿真:
首先创建dbg_master_scan的cell,创建一个verilog(functional)的cellview,复制.v文件,check save后生成symbol,注意替换绝对路径include("/绝对路径/scan_task.v")
和include("/绝对路径/stimulus.v")
替换scan_task.v中的绝对路径,示例$readmemb("/绝对路径/scan_sdin_input.txt")
和$readmemb("/绝对路径/scan_drdy_output.txt")
,
替换stimulus.v中的绝对路径$fopen("/绝对路径/xor_scan_output.txt")
在数字门级网表xxx_dig_top_enc.v中,手动incldue "/绝对路径/tcb018bcdgp2a.v"
,然后开始导入流程,在cadence的CIW中,File → Import → Verilog
,按照以下设置导入文件,注意Structural Module = Functional, Verilog Cell Modules = Import
,最好导入到新创建的库
导入后,在xxxdig_top的functional cellview中最后,增加反标命令,其中xxx.log可以带上绝对路径,如果不带的话,xxx.log会在仿真器的网表路径下/simulation/…./ams/config/netlist/xxx.log
module xxx_dig_top();
...
...
initial begin
$sdf_annotate("/绝对路径/xxx.sdf",,,"xxx.log","MAXIMUM");
end
endmodule
之后按照标准的AMS流程仿真,最好将与SCAN模式相关的pads_top替换成门级网表进行仿真。输出的XOR结果全为0,则表示结果是正确的。
在xrun.log或者xxx.log中报一下warning可能并不是致命错误(有待深入理解):
Unable to annotate to non-existent triming check….
Annotion resulted in a negative dely value or pulse limit to sepcify path or interconnect delay…
之前存在收敛风险但最终仿真成功的verilogams模型,可能在进行数字门级网表+SDF反标DELAY仿真时不再收敛。本质还是模型写得有瑕疵,将real型的变量传递到electrical节点时,一定注意这个real型的变量有初值,最好在initial
中给一个初值,always@(*)
无法真正赋予变量初值,容易造成收敛错误。
$sdf_annotate(SDF_FILE, INSTANCE_PATH, SDF_SETUP_HOLD_CHECK, LOG_FILE, SDF_DELAY_TYPE, SCALE_FACTORS, CONSTRAINT_FILE);
1
或 0
,默认值为 1
(开启)。"MINIMUM"
、"TYPICAL"
或 "MAXIMUM"
,用以选择 SDF 文件中的哪种延迟值进行仿真。("1.0", "1.0", "1.0")
,对应缩放 MINIMUM
、TYPICAL
和 MAXIMUM
延迟值。$sdf_annotate("design.sdf", u_top, 1, "design.log", "TYPICAL", ("1.0", "1.0", "1.0"), "constraints.sdf");
这个语法示例表示,将 design.sdf
文件中的延迟信息加载到 u_top
实例化模块中,开启 setup/hold 时间检查,日志记录到 design.log
,使用 TYPICAL
延迟,延迟值不缩放,并加载 constraints.sdf
中的时序约束信息。
通过 $sdf_annotate
,你可以确保在仿真中考虑到综合后的时序信息,从而获得更精确的仿真结果。
在SDF文件中,延迟信息通常会按照不同的条件进行分类,分别表示最小延迟(MINIMUM)、典型延迟(TYPICAL)和最大延迟(MAXIMUM)。这些延迟值是在不同工艺角(corner case)下测量得到的,用来反映电路在不同条件下的性能。
要知道SDF文件中分别对应的MINIMUM、TYPICAL和MAXIMUM延迟信息,可以查看SDF文件中的延迟标注部分。SDF文件通常由多个块组成,每个块都可能包含以下几个部分:
在每个延迟条目下,通常会提供三组数据,对应MINIMUM、TYPICAL和MAXIMUM三种延迟值。
(DELAY (ABSOLUTE (IOPATH (posedge CK) (posedge Q) (1.0:2.0:3.0)) (IOPATH (negedge CK) (negedge Q) (0.9:1.8:2.7)) (INTERCONNECT U1/A U2/B (0.5:1.0:1.5)) ) )
在这个示例中:
CK
上升沿到输出 Q
上升沿的延迟路径。在另一个路径中:
(0.9:1.8:2.7):同样表示从 CK
下降沿到 Q
下降沿的延迟值,分别为最小、典型和最大延迟。
(INTERCONNECT U1/A U2/B (0.5:1.0:1.5)):表示模块 U1
的端口 A
到模块 U2
的端口 B
之间的连线延迟,分别对应最小、典型和最大延迟。
在Verilog仿真中,通过 $sdf_annotate
的第五个参数可以选择使用哪种延迟类型:
"MINIMUM"
:选择SDF文件中的最小延迟值。"TYPICAL"
:选择SDF文件中的典型延迟值。"MAXIMUM"
:选择SDF文件中的最大延迟值。通过查看SDF文件中的延迟条目(如 IOPATH
或 INTERCONNECT
),你可以看到三组数字,分别表示最小、典型和最大延迟值。这些值可以在时序仿真中通过 $sdf_annotate
指定的延迟类型进行选择,以反映不同条件下的时序行为。