VHDL仿真实时?

时间:2014-06-02 20:06:45

标签: real-time vhdl

我编写了一些包含RTC组件的代码。由于时钟速度设置为50MHz所以对代码进行适当的仿真有点困难,因此看到发生的任何“实时”事件将永远需要。我确实尝试在modelsim中进行2秒的模拟,但最终崩溃了。

如果我没有评估板进行刻录和测试使用范围,那么最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

如果您可以提供一个更具体的示例,说明您正在尝试测试的内容以及正在咀嚼模拟周期的内容将会有所帮助。

通常,如果您需要在仿真中测试很多代码,那么如果您可以创建子模块的测试平台并首先对其进行测试,则会很有帮助。通常,如果您在顶层(芯片)级别进行模拟并尝试激发深埋在设计层次结构中的子模块,则需要许多时钟滴答才能将数据导入和导出子模块。如果您直接模拟子模块,您可以直接访问模块I / O,并且可以在比您尝试从顶层获取模块的周期更短的周期内测试要在该模块中测试的内容。

如果您正在尝试测试您尝试填充的具有非常深的FIFO的逻辑或您尝试命中的大型计数器的特定计数,您可以为代码添加逻辑以帮助创建这些逻辑更少周期的条件(如计数器上的加载指令)或者您可以从测试平台本身强制设计的内部信号值。

这些只是一些一般性的想法。同样,如果您提供有关您的模拟的更多详细信息,此论坛上的人可能会提供更具体针对您的问题的帮助。

答案 1 :(得分:0)

正如Ciano已经提到的,如果您提供了有关您的设计的更多信息,我们将能够提供更准确的答案。但是,硬件设计人员应遵循一些技巧,特别是对于复杂的系统仿真。其中一些(我主要使用)列在下面:

  • 分层模拟(如Ciano,已发布):尝试模拟较小的模块集,而不是模拟整个系统。

  • 选择性配置:大多数系统需要一些初始化过程,如复位初始化时间,外部芯片寄存器初始化等等...通常出于模拟目的,其中一些不需要而且你需要在模拟时可以使用全局常量来跳过这些阶段,例如:

    constant SIMULATION_ENABLE : STD_LOGIC := '1'; ...; -- in reset condition: if SIMULATION_ENABLE = '1' then currentState <= state_executeSystem; -- jump the initialization procedures else currentState <= state_initializeSystem; end if;

    注意,不要直接修改代码(硬编码)。随着系统的增加,无法记住您修改的模拟部分。如上例所示,使用常量来将模块配置为模拟配置文件。

  • 缩放时间/大小常量:而不是使用(每次)时间和大小的实际值(例如时间事件,内存大小,寄存器文件大小等)使用缩放值只要有可能。例如,如果要构建一个每60秒向主系统生成一次中断的RTC - 缩放常量(如果可能)以产生大约(6ms,60us)的中断。当然,比例选择取决于您的系统。在我的设计中,我使用了两个全局配置文件。其中一个用于模拟,另一个用于合成。大多数常量值按比例缩小以缩短模拟时间。

  • 增加抽象:对于更大的模块,创建一个简化的抽象模块可能很有用,可以作为模块的模型。例如,如果您的处理器具有此RTC(您提到)作为外设,则可以创建此RTC的简化模块。假装您只需要它的中断,您可以创建一个简化的模型,例如:

    constant INTERRUPT_EVENTS array(1 to 2) of time := ( 32 ns, 100 ms ); process for i in 1 to INTERRUPT_EVENTS'length loop rtcInterrupt <= '0'; wait for INTERRUPT_EVENTS(i); rtcInterrupt <= '1'; wait for clk = '1' and clk'event end for wait; end process;