Io VHDL-ModelSim测试台模拟在发送时冻结;“运行”;

Io VHDL-ModelSim测试台模拟在发送时冻结;“运行”;,io,vhdl,modelsim,Io,Vhdl,Modelsim,我有一个关于我正在为计算傅里叶变换的硬件蝴蝶算法开发的测试台的问题 我试图做的是读取一系列输入数据文件(32位向量)并将输出写入其他输出文件 输入文件为Ar.txt、Ai.txt、Br.txt、Bi.txt、Wr.txt和Wi.txt 输出文件为Ar_OUT_TB.txt、Ai_OUT_TB.txt、Br_OUT_TB.txt、Bi_OUT_TB.txt 但当我尝试使用ModelSim进行模拟时,程序只是冻结了:我仍然可以做一些事情,比如打开另一个项目/文件等,但是没有显示波形,而且命令行也丢失

我有一个关于我正在为计算傅里叶变换的硬件蝴蝶算法开发的测试台的问题

我试图做的是读取一系列输入数据文件(32位向量)并将输出写入其他输出文件

输入文件为Ar.txt、Ai.txt、Br.txt、Bi.txt、Wr.txt和Wi.txt

输出文件为Ar_OUT_TB.txt、Ai_OUT_TB.txt、Br_OUT_TB.txt、Bi_OUT_TB.txt

但当我尝试使用ModelSim进行模拟时,程序只是冻结了:我仍然可以做一些事情,比如打开另一个项目/文件等,但是没有显示波形,而且命令行也丢失了。我还试图模拟我的一个旧的VHDL项目,它确实进行了模拟,所以我猜问题出在这段代码中

以下是主要流程(编辑:为了理解,我还添加了代码的其余部分):

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
使用STD.TEXTIO.ALL;
实体BUTTERFLY_测试台是
端部蝶形试验台;
介绍了蝶形试验台的结构和装置
组件progetto_蝴蝶
通用(N_IN,N_OUT:INTEGER:=32;
N_总线:整数:=63);
端口(START、CLK、MAIN)在标准逻辑中;
数据输入、工作输入、工作输入:已签名(N输入-1向下至0);
数据输出:已签署的输出(N输入-1向下至0);
完成:输出标准(U逻辑);
端部元件;
常数N_IN:INTEGER:=32;
常数N_OUT:整数:=32;
信号测试数据输入、测试波形输入、测试波形输入:有符号(N输入-1向下至0);
信号测试输出:有符号(N_OUT-1向下至0);
信号时钟:标准逻辑;
信号测试开始、测试开始、测试完成:标准逻辑;
_文件中的文件Ar_:文本打开读取模式为“Ar.txt”;
_文件中的文件Ai_:文本打开读取模式为“Ai.txt”;
文件中的文件Br\u:文本打开读取模式为“Br.txt”;
文件中的文件BIU:文本打开读取模式为“Bi.txt”;
文件WR_FILE:文本打开读取模式为“WR.txt”;
文件WI_文件:文本打开读取模式为“WI.txt”;
文件Ar_OUT:文本打开写入模式为“Ar_OUT_TB.txt”;
文件Ai_OUT:文本打开写入模式为“Ai_OUT_TB.txt”;
文件Br\u OUT:文本打开写入模式为“Br\u OUT\u TB.txt”;
文件Bi_OUT:文本打开写入模式为“Bi_OUT_TB.txt”;
开始
蝶形测试组件:progetto蝶形端口映射(开始=>TEST\u开始,CLK=>CLK,MAIN\u RST\u N=>TEST\u RST,
数据输入=>测试数据输入,Wr输入=>测试数据输入,Wi输入=>测试数据输入,
数据输出=>测试输出,完成=>测试完成)``
过程中的数据:过程
变量数据缓冲区:行;
变量数据_刺激:位向量(N_IN-1向下至0);
开始
如果不是(ENDFILE(Br_IN_FILE)),则
如果(TEST_START='1'和TEST_RST='1'),则
读线(Br\u在\u文件中,数据\u缓冲区);
读取(数据缓冲区、数据刺激);

在中测试数据\u您的流程需要敏感度列表或
等待
语句

根据您的示例构建MVCe后,我发现您正在读取的输入文件似乎太短,显示了您的两个进程(数据进程中的进程和wr进程)中的错误

在data_in_进程中的进程结束之前,否则如果end_FILE(br_in_FILE)为TRUE,它将在不挂起的情况下循环。(你应该有一个或多个测试来覆盖你所有的输入)

我补充说

        wait until rising_edge(clk); -- added for endfile
        wait for 20 ns; -- added for when endfile(wr_file) is TRUE.
出于同样的原因,对wr_过程进行测试

对写入_过程的更改用于发现测试_输出信号的工作范围。请注意,变量i的流程声明项可以删除,但不使用。(循环中的i不是i常量)


在UNIX环境(OS X)中,我通过触摸输入文件发现了输入文件的问题,输入文件的长度为零(在确保VHDL模拟器不存在时会发出抱怨之后)。

您的
数据输入进程是一个无限循环。只要不满足条件
TEST\u START='1'和TEST\u RST='1'
,流程就会继续运行,而不会增加模拟时间。它会消耗模拟器时间,模拟时间不会增加

通过添加
等待上升沿(CLK)来解决此问题
else
子句中


这里列出了代码的其他问题:

我认为在测试台中不需要感知列表。至于WAIT语句,我应该等待什么?时钟?在这一过程的哪一点上?在一开始?一个缺少敏感度列表和/或等待语句的进程需要在短时间内反复执行其内部语句。这就是您的模拟器根据您的请求基本上要做的事情。所有进程都有一个
wait
语句。但是在每个分支中都应该有一个
wait
语句。所有驱动程序的预计输出波形中的预定事件都用完了,您将模拟时间提前到“现在高”或“现在高”(这可能需要一段时间)。Modelsim中的run命令可以提供较短时间间隔的执行时间。您不会显示整个模型,尤其是声明。这不是一个。我添加了其余的代码。至于“现在”高,你能解释一下你的意思吗?选择中断选项后,modelsim向我显示模拟在第102行中断,这是WI_进程的endfile循环的结束。我在循环结束后添加了一个WAIT语句(只是WAIT)。它是否与您建议的输入文件长度相关?但对我来说还是有点奇怪:为了调试,我确保所有文件只有一行,表示我的输入数据(一行表示Ar,一行表示Ai,等等)。怎么可能?是的,就是这样。我同时删除了WHILE语句和IF语句。现在它跑了!感谢
        wait until rising_edge(clk); -- added for endfile
        wait for 20 ns; -- added for when endfile(wr_file) is TRUE.