ModelSim中如何打印子模块中的信号到txt文件
0赞关于数字信号处理(DSP)的FPGA设计,最方便的设计验证方式无疑是Simulink和ModelSim的联合仿真平台,好处就不多说了,但我不会~
下面我要说的是一般流程中遇到的一个小问题。一般的流程如下:
1) MATLAB生成FPGA DUT的激励数据,该数据一般保存在可供EDA仿真软件(ModelSim或者VCS)读取的文件中,最简单的无疑是txt文档了;
2) EDA仿真工具从该文件读取数据,将DUT的输出保存到文件,当然,该文件也是MATLAB支持的文件格式。
3) MATLAB读取该数据,进行验证。
问题就是,经过MATLAB验证,发现FPGA DUT设计有问题,想把中间信号抽出来看。其实,往EDA软件中的wave窗口中添加子模块的信号很简单,但却导不出来,网上搜了一些,说可以导出为VCD文件,看了半天没看懂。
用屁股都可以想出来,只要把DUT中子模块的信号牵出来到顶层就行了,但这样太麻烦,需要修改设计v文件的output。网上搜到一些结果,方法2种:
1 采用引导语句synopsys translate_off和synopsys translate_on
这两条语句可以指示综合器,语句之间的Verilog代码不被综合。因此,可以将下面一大段代码放入DUT中的子模块:
// synopsys translate_off
initial begin : output_to_txt_file
integer fp;
fp = $fopen("temp.txt", "w");
forever begin
#`PERIOD $fdisplay(fp, "%b", signals); // 将该模块的signals输出到txt文本
end
end
// synopsys translate_on
2 在testbench中直接将子模块的信号打印出来,语法如下:
$fdisplay(fp , "%d", tb.DUT.signals); // tb为testbench的模块名,DUT是被测模块,signals是子模块的信号
无疑,第二种方法更简单。
后话:
有时间还是看看Simulink和ModelSim的联合仿真平台的搭建吧,这个确实太爽了,从设计到验证,全都可以由MATLAB/Simulink做完,连综合软件都不用开的,直接指明路径;步骤如下:
1) Simulink建模
2) 定点仿真
3) FPGA代码转换
4) STA和优化(包括pipeline、folding & unfolding)
5) 板级验证,这在MATLAB中叫FPGA in-the-loop,缺点是必须是MATLAB支持的开发板,类型比较少。我数了下,在MATLAB 2012b中,支持的开发板总数才10类左右,而且大部分还是Xilinx的)
以上步骤看起来简单,但实际上每一步都涉及到很多东西,不仅仅是理论知识,还有软件的使用。就拿FPGA代码转换来说,首先要保证代码是可以转换的,这里面就有很多禁忌。再比如,要是平常自己手写的verilog或者VHDL代码,出问题了手动改就行了。但现在不行,要是手动改,就意味着Simulink模型和FPGA代码脱离的关系,那么后续的步骤都没法做,所以必须从Simulink中去改模型,这就需要对Simulink比较熟悉才行。
拿一个简单的例子来说明,学习这一套流程就好比学vim或者laTeX,刚开始学起来特别痛苦,但一旦熟悉之后,效率会超级之高。
可惜的是,目前为止还不会呀~囧
