Vivado:为输入和输出延迟、仿真不匹配和错误时钟行为设置时序约束
Vivado: setting timing constraints for input and output delay, simulation mismatch and wrong clock behavior
我正在使用 Vivado 2019.2.1 在 Verilog 中实现哈希算法。一切(包括综合和实现)都运行良好,但我最近注意到行为模拟(正确的哈希摘要)的结果与 post-synthesis/-implementation 功能和时序模拟不同,即我收到同一电路的三个不同值 design/code.
我的基本配置包含一个使用默认`timescale 1ns / 1ps 的测试平台和用于切换时钟寄存器的#1 延迟。我使用 xdc 文件进一步将时钟频率限制为 10 MHz。在综合过程中,没有显示任何错误(甚至警告,除了一些 "parameter XYZ is used before its declaration"),并且我的代码中没有混合非阻塞和阻塞赋值。尽管如此,我注意到 post-* 模拟(无论是功能还是时序)需要更多的时钟周期(例如 58 而不是 50,直到特定寄存器的值被切换)才能实现相同的电路状态.我的设计是完全同步的,由一个时钟驱动。
这让我看到了时序报告,我注意到 10 个输入和 10 个输出延迟没有受到限制。此外,Design Timing Summary 显示 worst negative slack
的设置非常接近一个时钟周期的时间。我按照 Vivado 文档和教程视频尝试了一些输入和输出延迟的组合,但我不确定如何找出合适的值。总松弛度(TNS、THS 和 TPWS)为零。
此外,我尝试降低时钟频率,因为 FSM (= top) 模块中控制逻辑的某些信号的传播延迟可能太大。然后发生的奇怪事情是模拟从未达到 $finish;在我的测试台上,除了时钟寄存器外,没有任何东西改变了它在波形中的值。在行为模拟中,一切都按预期进行,但这似乎不受约束甚至时间的影响。在我的测试台中监控 o_round_done 线(由单独子模块中的 LFSR 确定),我注意到对于行为模拟,该线的值随时钟变化,而对于 post-* 模拟值更改有一个小的延迟:
行为模拟
时钟周期:481,round_done:0
时钟周期:482,round_done:1
时钟周期:483,round_done:0
总共1866个时钟周期
Post-实现功能模拟
时钟周期:482,round_done:0
时钟周期:482,round_done:1
时钟周期:483,round_done:1
时钟周期:483,round_done:0
总共1914个时钟周期
Post-实现时序仿真
警告:"C:\Xilinx\Vivado19.2\data/verilog/src/unisims/BUFG.v"第 57 行:在时间 997845 /tb/fsm/i_clk_IBUF_BUFG_inst/TChk57_10300 范围内的时间违规 ps $period(posedge I,(0:0:0),通知程序)
警告:"C:\Xilinx\Vivado19.2\data/verilog/src/unisims/BUFG.v" 第 56 行:在时间 998845 /tb/fsm/i_clk_IBUF_BUFG_inst/TChk56_10299 范围内的时间违规 ps $period (negedge I,(0:0:0),notifier)
模拟从不停止ps(可能是因为round_done从不为1)
你知道我做错了什么吗?我想知道为什么电路在非常低的时钟频率(例如 500 kHz)下不能正常工作,因为据我所知,这将为每个信号提供足够的时间 "travel" 到达正确的目的地。
我注意到的另一件事是,在行为模拟中,分配给子模块中寄存器的一根线是 8'bXX,直到连接的寄存器是 "filled",但在 post-*模拟它是 8'b00 从一开始。有什么想法吗?
此外,什么实际定义了模拟的时钟频率?测试台中的值(时间刻度和延迟#)或 xdc 文件中的约束?
我找到了一个问题的解释,为什么 post-* 模拟与行为模拟 w.r.t 的行为不同。 Xilinx Vivado Design Suite User Guide for Logic Simulation (UG900).
中的时钟周期等
在设计的实际计算开始之前导致“延迟”的原因称为 Global Set and Reset (GSR)
并且需要 100ns:
The glbl.vfile declares the global GSR and GTS signals and automatically pulses GSR for 100ns. (p. 217)
因此,我通过让测试台等待控制逻辑(=有限状态机)就绪,即更改为RESET后的状态来解决问题。
我正在使用 Vivado 2019.2.1 在 Verilog 中实现哈希算法。一切(包括综合和实现)都运行良好,但我最近注意到行为模拟(正确的哈希摘要)的结果与 post-synthesis/-implementation 功能和时序模拟不同,即我收到同一电路的三个不同值 design/code.
我的基本配置包含一个使用默认`timescale 1ns / 1ps 的测试平台和用于切换时钟寄存器的#1 延迟。我使用 xdc 文件进一步将时钟频率限制为 10 MHz。在综合过程中,没有显示任何错误(甚至警告,除了一些 "parameter XYZ is used before its declaration"),并且我的代码中没有混合非阻塞和阻塞赋值。尽管如此,我注意到 post-* 模拟(无论是功能还是时序)需要更多的时钟周期(例如 58 而不是 50,直到特定寄存器的值被切换)才能实现相同的电路状态.我的设计是完全同步的,由一个时钟驱动。
这让我看到了时序报告,我注意到 10 个输入和 10 个输出延迟没有受到限制。此外,Design Timing Summary 显示 worst negative slack
的设置非常接近一个时钟周期的时间。我按照 Vivado 文档和教程视频尝试了一些输入和输出延迟的组合,但我不确定如何找出合适的值。总松弛度(TNS、THS 和 TPWS)为零。
此外,我尝试降低时钟频率,因为 FSM (= top) 模块中控制逻辑的某些信号的传播延迟可能太大。然后发生的奇怪事情是模拟从未达到 $finish;在我的测试台上,除了时钟寄存器外,没有任何东西改变了它在波形中的值。在行为模拟中,一切都按预期进行,但这似乎不受约束甚至时间的影响。在我的测试台中监控 o_round_done 线(由单独子模块中的 LFSR 确定),我注意到对于行为模拟,该线的值随时钟变化,而对于 post-* 模拟值更改有一个小的延迟:
行为模拟
时钟周期:481,round_done:0 时钟周期:482,round_done:1 时钟周期:483,round_done:0
总共1866个时钟周期
Post-实现功能模拟
时钟周期:482,round_done:0 时钟周期:482,round_done:1 时钟周期:483,round_done:1 时钟周期:483,round_done:0
总共1914个时钟周期
Post-实现时序仿真
警告:"C:\Xilinx\Vivado19.2\data/verilog/src/unisims/BUFG.v"第 57 行:在时间 997845 /tb/fsm/i_clk_IBUF_BUFG_inst/TChk57_10300 范围内的时间违规 ps $period(posedge I,(0:0:0),通知程序) 警告:"C:\Xilinx\Vivado19.2\data/verilog/src/unisims/BUFG.v" 第 56 行:在时间 998845 /tb/fsm/i_clk_IBUF_BUFG_inst/TChk56_10299 范围内的时间违规 ps $period (negedge I,(0:0:0),notifier)
模拟从不停止ps(可能是因为round_done从不为1)
你知道我做错了什么吗?我想知道为什么电路在非常低的时钟频率(例如 500 kHz)下不能正常工作,因为据我所知,这将为每个信号提供足够的时间 "travel" 到达正确的目的地。
我注意到的另一件事是,在行为模拟中,分配给子模块中寄存器的一根线是 8'bXX,直到连接的寄存器是 "filled",但在 post-*模拟它是 8'b00 从一开始。有什么想法吗?
此外,什么实际定义了模拟的时钟频率?测试台中的值(时间刻度和延迟#)或 xdc 文件中的约束?
我找到了一个问题的解释,为什么 post-* 模拟与行为模拟 w.r.t 的行为不同。 Xilinx Vivado Design Suite User Guide for Logic Simulation (UG900).
中的时钟周期等在设计的实际计算开始之前导致“延迟”的原因称为 Global Set and Reset (GSR)
并且需要 100ns:
The glbl.vfile declares the global GSR and GTS signals and automatically pulses GSR for 100ns. (p. 217)
因此,我通过让测试台等待控制逻辑(=有限状态机)就绪,即更改为RESET后的状态来解决问题。