前言:
以前我的FPGA工程都是自己编写TESTBENCH进行仿真,不过有几个缺点:
1,随着工程的复杂程度,需要编写的TESTBENCH也越来越复杂,工作量太大。
2,输入信号不好模拟,只能生成一些比较标准的信号。复杂信号的产生也是需要很大的工作量。
最近发现MATLAB和XILINX官方有合作的simulink,可以很方便地对VIVADO工程进行仿真,就把自己做的一个小工程拿来练习了一下。 我用的是MATLAB,首先打开里面的simulink,如下所示: 新建一个.SLX文件,并且把VIVADO里面的.V文件复制到同一个目录下,然后在TOOL里面的libiary里面找到xilinx的资源库,使用里面的black box。
会让你选择使用哪一个.V文件,确认后会自动生成端口,并在文件夹里面生成一个.m文件。对了,我是用VERILOG写的,要求里面不能有大写字母和某些关键字,不然会报错。(虽然VIVADO能编译通过)
4.先写了一个很简单的代码实验一下,已经成功输出波形。输入只有一个触发信号,输出了一个计数器和一个固定数,我理解的是黄色的那个IN,OUT端口相当于AD和DA,把输入转换成数字信号送给FPGA,再把输出转换成模拟信号显示在示波器上面。
输出波形如下图:
5.专门说一下时钟的问题
simulink的时钟是在system generator里面设置的,导入的balck box没有时钟引脚,但是导入的信号信号必须成对出现才能识别,所以在.V文件里面要加一个时钟的使能引脚,这样在导入的时候就不会把时钟引脚识别成信号引脚了。
6.如果在主程序内又调用了其它.v文件,则需要人为修改生成的**_config.m文件。
7.好像MATLAB里面不能使用下降沿,我的奇分频模块用了上升沿和下降沿分别计数,但是只出来了上升沿的变化,下降沿好像没有生效。
8.每次更改了主程序的.V文件后,好像必须重新生成_config.m文件,不然就会报错?(不需要,是我文件名写错了)
小结:
就目前学习情况来看,个人觉得simulink和testbench的区别主要以下几点:
输入信号的仿真:
simulink可以模拟比较复杂的信号,比如各种调制信号,带噪声的信号等。目前我在testbench里面只能写比较标准的正弦波、方波等。但是好像testbench也支持外部数据的直接导入(这个我还没用过,应该也可以直接把MATLAB生成的数据导入进去)。输入时钟模拟:
simulink是系统时钟,也支持多时钟域,不过好像要设置在不同的Subsystem里面。同一个Subsystem里面好像只支持一个系统时钟。testbecnh里面我是自己用initial 生成的不同时钟,感觉要方便一些。仿真结果查看:
simulink是查看的端口输出,如果想在调试过程中看中间的数据,首先必须映射到端口输出,这样好像就必须重新生成black box和.m文件。而testbench是直接在VIVADO里面仿真,任何一个数据都能直接查看,方便太多。
以上都是个人观点,simulink和testbench我都属于新手,有不同看法或者更方便用法的欢迎交流。
02 10:今天才知道原来testbench仿真时对有些输出控制信号不用写逻辑代码,可以通过查看仿真结果,在出错的时间点直接写控制信号。比如我的仿真卡死在5865010ns处,查到原因是spi返回状态不对,可以直接用以下方式给输入信号赋值。
//----FLASH工作卡死在RFLAG_STA---// +503650//spi_status[7] == 'b1时跳下一状态initialbegin#5865010 io_n25_sdio_reg <= 4'hf;#60 io_n25_sdio_reg <= 4'hf;#60 io_n25_sdio_reg <= 4'hf;#240 io_n25_sdio_reg <= 4'hf;#60 io_n25_sdio_reg <= 4'hf;end
不用我用了之后,发现这样做的好处是对有些复杂的模块不需要了解其功能,只需要知道他为什么出错,就可以跳过这一段。但是也存在一些不好的地方:
1.如果有些问题是循环出现的,比如说是状态机卡死在某个状态,有可能会不断出现,就必须重复写很多段这个代码
2.就是主程序代码如果有改动,有可能会导致出错的时间点变了,又必须重新去改时间。
如果是在testbench里面用逻辑代码实现,就不会有这些问题。所以还是看实际情况使用吧。
.07.08
今天用simulink仿真时碰到一个问题,在用DDS Compiler 6.0这个IP核时,如果用固定频率仿真就没问题,如果使用里面的可变频率输入时就会出错。
开始一直以为是IP核有问题,版本不对或者什么的,后来发现是这个频率输入端口的问题,他要求必须是32位定点数,我如果
把这个NCO送其它数据格式就出现如下提示:
Input port 's_axis_config_tdata_pinc' is expected to be UFix_32_32, but is BoolError occurred during "Rate and Type Error Checking".
如果我发送定点数,就直接报错什么IP核调用失败。
报错如下:
ERROR: [USF-XSim-62] 'elaborate' step failed with error(s). Please check the Tcl console output or 'C:/Users/lij2/AppData/Local/Temp/xlsim62c7c60e/hdl_netlist/xelab.sim/sim_1/behav/xsim/elaborate.log' file for more information. Please refer to 'C:/Users/lij2/AppData/Local/Temp/xlsim62c7c60e/vivado.log' for more details.
去log文件里面查出来是,还没找到原因。
ERROR: [VRFC 10-147] xbip_pipe_v3_0_5.xbip_pipe_v3_0_5_viv_comp failed to restoreERROR: [VRFC 10-213] Registering Dependencies Error: The primary unit 'xbip_pipe_v3_0_5_viv_comp' could not be found during restore
--------------------------------------------------------------分割线------------------------------------------------------------------------------------
1)这个问题在别人电脑上没有出现,应该还是simulink设置的原因。
2)把这个编译成IP核后,在VIVADO上仿真时,也报错了,感觉 和MATLAB报错是一样的。
不过VIVADO里面有解决办法,这里直接引用别人的文章
/Reborn_Lee/article/details/95316014
结果按照这个设置后能进仿真界面了,但是仿真是报致命警告
ERROR: [Simulator 45-1] A fatal run-time error was detected. Simulation cannot continue.
--------------------------------------------------------------分割线------------------------------------------------------------------------------------
没办法,没找到原因,把DDS Compiler 6.0这个IP核改成固定频率了,然后生成IP核,能够在VIVADO里面正常运行。又遇到一个新的问题,就是想在一个自定义IP核(IP1)里面使用MATLAB生成的这个IP核(IP2),但是每次重新打开工程时都会找不到这个IP核,在网上查了一个方法,/weixin_42553916/article/details/121137954,不过照着做了还是没有解决,个人觉得是因为编辑自定义IP1时没有把IP2的目录正确导入。然后解决办法是新建一个工程,把IP1和IP2弄在一起,然后再生成一个新的IP3,这样在其它工 程里面调用IP3,就不然出现IP2找不到的问题了。
PS:在设置IP端口时需要手动设置CLK和RESET端口参数,不然VIVADO不能自动识别,把CLK连接到这个端口上就会报错。
如果觉得《使用MATLAB对VIVADO工程进行simulink仿真》对你有帮助,请点赞、收藏,并留下你的观点哦!