mips core simulation
1. RTL 设计
遵照MIPS五级流水(IF, ID, EX, MEM, WB)体系结构进行相应的RTL设计。
包含ROM(或者I cache, 在IF_stage),regfile,RAM(或者是D cache,在MEM_stage)。
2. 仿真
Xilinx的memory interface 可以分为三种:intereface, coregen, primitive
三种形式的可控性由低到高,interface 是auto-infer出来的,coregen是使用 IP tool来创建,primitive是直接使用相应的module primitive 来得到。
相应的三种方式的平台移动性是由高到低。
这里就interface 和coregen两种方式谈谈。
a. interface
在使用这种方式的时候,顶层的verilog 采用readmemb从预编译好的程序二进制文件中读取数据。
$readmemb("http://www.cnblogs.com/bench/mips_16_core_top/test1.prog",uut.IF_stage_inst.imem.rom);b. 如果是使用coregen的方式生成rom
其中就会涉及coe file的编写。.coe 文件的格式如下。
; Sample initialization file for a; 32-bit wide by 16 deep RAM(这是注释说明性文字)
memory_initialization_radix = 16;(2,10,16,分别表示2进制,10进制,16进制)
memory_initialization_vector =
0, 1, 2, 3, 4, 5, 6, 7, (中间分号隔开)
8, 9, A, B, C, D, E, F;(最后用“;”结尾)
这里分别使用了 memory_initialization_radix 和 memory_initialization_vector来作为radix value 和data value的关键词。
reference: http://www.xilinx.com/itp/xilinx10/isehelp/cgn_r_coe_file_syntax.htm
像是波形生成一般可以使用matlab来产生,当然,如果是编译过的程序二进制文件。也可以编写perl或python脚本来进行批处理。
不过在综合的过程中,需要注意的是应该在Implement> Translate> Process Properties下面设置Macro Search Path,找到生成IP的路径。否则便会报出ERROR:NgdBuild:604的错误(reference)。
3. 评注
a. MIPS core post layout sim没有意义,重要的是资源分析, timing/power analysis
和Multiplier的post-layout不同,MIPS core的顶层如下
);
只能是控制clk, rst, pc。并不能得到很有意义的结果,并且在modelsim下面,(add wave sim:/mips_16_core_top_tb_0_v/uut/*)uut下面的信号也并没有很强的逻辑关联。于此不同,
Multiplier Multiplier_U(.rst(rst), .clk(clk), .multiplier_in(multiplier), .multiplicand_in(multiplicand), .product(product)) ;
却能很好地反映信号关系。 这也是层次化设计testbench,自底向上逐层验证模块的验证思想所在。
b. memory有关的验证
在验证方法学中,和memory有关验证有两种方式,一种是frontdoor,消耗仿真时间,一种是backdoor不消耗仿真时间。两种方式的区别在于,前者是按照时序往memory中进行数据设置,后者是直接强制设置。
c. defs. package
在验证方法学中,一般会加入package file来进行一些宏定义对仿真验证进行控制,或者对设计参数进行调整。
而在这里的从仿真到综合的统一设计中,也可以加入宏定义进行控制,极大地方便设计。例如
in def file
`define SIMULATION_MODE
in src file
`ifdef SIMULATION MODE
XXX
`endif
OR
`ifndef SIMULATION_MODE
XX
`endif