对于一些参数、模拟器和 RTL 编码风格组合,模拟中的该模块的延迟与预期的延迟视同一个时钟而异。实际硬件实现了预期的延迟。
例如,如果驱动 DSP 模块的时钟是生成输入数据的时钟延迟版本,从而对输入时钟产生比输入数据更多的模拟延迟。
要解决此问题,必须确保将输入数据生成到 DSP 模块的时钟与 DSP 模块的输入时钟之间的延迟因输入数据的延迟而平衡。或者,与 DSP 模块的输入时钟相比,可确保输入数据在以后的绝对时间到达,或者较晚的模拟并联网延迟时间。
请注意,诸如时钟路径上的更多分配语句与数据路径相比较,将导致这些路径之间的模拟并联网延迟差异。
要做到这一点,请将您的测试台修改为:
- 确保 为 Native DSP 模块生成时钟输入的信号与对原生 DSP 模块的时钟输入完全相同。
- 如果 #1 不可行,则 会延迟 输入数据相对于时钟。
例如,请考虑以下原始 RTL 代码:
原始 RTL:
clk_gen:流程
开始
clk_orig <= \'0\';
等待 5 ns;
clk_orig <= \'1\';
等待 5 ns;
最终过程;
...
如果 (rising_edge(clk_orig)),
ax <= ax 1;
ay <= ay - 1;
如果
mac_test_bad_style:mult_acc
端口映射(
...
ax => std_logic_vector(ax),-- [in]
ay => std_logic_vector(ay), -- [在]
clk =>(“00” &clk_orig),-- [在]
resulta => 结果 2, -- [out]
...
);
结果a2 将显示比预期低一个时钟的延迟。注意,乘法器\clk 端口分配中的“00 clk”的串联在生成输入数据的“clk_orig”中增加了一个模拟并联延迟。
可能的变通方法包括:
示例 1、建议:全程使用 3 位时钟
可直接生成乘法器的 3 位时钟,并使用活动位为输入数据时钟:
clk_gen:流程
开始
clk3bit <= \'000\';
等待 5 ns;
clk3bit <= \'001\';
等待 5 ns;
最终过程;
...
如果 (rising_edge(clk3bit(0)))则
ax <= ax 1;
ay <= ay - 1;
如果
mac_test_bad_style:mult_acc
端口映射(
...
ax => std_logic_vector(ax),-- [in]
ay => std_logic_vector(ay), -- [在]
clk => (clk_3bit),-- [in]
resulta => 结果 2, -- [out]
...
);
示例 2、替代建议:将相应的延迟添加到输入数据中
\'clk =>(“00” & clk_orig)\' 的声明导致 \'clk“端口在 \'clk_orig\' 的驱动下增加了一个模拟 delta 延迟。要克服这一问题,您可以使用原始clk_gen过程,只需使用分配语句为数据添加模拟并联网延迟。
clk_gen:流程(与原始流程相同)
ax_del <= ax;
ay_del<=ay;
mac_test_bad_style:mult_acc
端口映射(
...
ax => std_logic_vector(ax_del),-- [in]
ay => std_logic_vector(ay_del),-- [在]
clk =>(“00” &clk_orig),-- [在]
resulta => 结果 2, -- [out]
...
);