1、说明
阿里的平头哥在github上开源了riscv项目-wujian100_open。本文是使用windows下的modelsim对该项目进行仿真(原开源项目是使用linux下的开源软件iverilog进行仿真)。
由于wujian100没有使用xilinx ip(我看ram'是使用触发器数组写的),所以可能可以不编译xilinx的仿真库。我电脑上xilinx仿真库是编译好且放到了modelsim.ini文件的。
把c代码的编译结果,hex文件,通过工具转换为pat文件。然后通过tb.sv把pat数据初始化到指令RAM里面,开始执行(即开始仿真)。我使用的git代码是2019.10.22的,激励文件是inst.pat,后面代码把文件名改成test.pat了(把激励文件名改为test.pat,放到仿真目录下即可)。
c编译结果到pat的转换,另外一个文档单独描述。本文只介绍modelsim的仿真过程。
仿真遇到的问题有:1、sv语法;2、timescale定义;3、tc文件增加模块调用。
对应提交了仿真的do文件,可以在wujian100并列的目录,建立目录sim1,然后执行附件里的do文件。新版无剑代码,需要把inst.pat改名为test.pat。
2、仿真过程
使用modelsim仿真,我习惯先在vivado的项目里启动modelsim,目的是自动获得编译do文件和vsim的do文件。(好处是文件列表自动生产了)。
无论modelsim直接仿真,还是vivado里启动modelsim仿真,有2个文件出现语法错误:busmnt.v和tb.v都会有语法错误。这是因为两个文件是sv语法写的。我采用的方法是可以把.v后缀改为.sv,就可以解决。其实直接使用modelsim时,也可以把compile的option从缺省的自动,修改为强制sv。
按照vivado里启动modelsim。编译xilinx库和加入simulation文件(tb目录下的文件),vivado的settiing里设置对应工具与库(这是基本操作,看vivaod使用吧)。
选择run simulation,modelsim启动,会报告:Module 'fsmc' does not have a timeunit/timeprecision specification in effect, but other modules do.。
修改报错的文件,包括:
wujian100_open/tb/virtual_counter.v,
wujian100_open/soc/usi0.v
wujian100_open/soc/dmac.v
加入:`timescale 1ns/100ps语句。
经过上述修改后,vivado可以启动modelsim并vsim加载成功了。
完成前面的修改(修改v到sv;增加timescale定义);建立一个仿真目录,该目录和wujian100_open目录并列(我起名sim1);
获得vivado产生的do文件,将vivado仿真目录下的complie和simulation的do文件,复制到仿真目录;同时复制modelsim.ini和glbl.v到该目录。
1、修改相对路径;2、只建立xil_default库就可以;3、加上选定的case仿真文件;4、去掉quit、wave的语句.修改可参见我的do文件。
需要在tc文件里,增加`define TB_MODULE wujian100_open_tb语句;增加对tb的例化:wujian100_open_tb wujian100_open_tb();
我是把case里的gpio_test.v,增加上面两句,并修改文件后缀,改为gpio_test.sv。
上传的inst.bat是timer.c产生的指令文件。已上传。
附注:解决sv和timescale问题,可以使用一个do文件里统一解决:1、v到sv,可以不修改,使用vlog参数或设置modelsim option;2、timescale和增加define,都是编译顺序,使用file list编译,应该都可以的。我不花时间去尝试了。