----[ 716985 ns] Number 8'd09 Functional Test Point PASS!!!
FATAL_ERROR: Vivado Simulator kernel has discovered an exceptional condition from which it cannot recover. Process will terminate. For technical support on this issue, please open a WebCase with this project attached at Support. Time: 717915 ns Iteration: 1 Process: /tb_top/soc_lite/data_ram/inst/native_mem_module.blk_mem_gen_v8_4_4_inst/NetRegassign3314_721 File: H:/CPU/CPU_CDE/mycpu_verify/run_vivado/mycpu_prj1/mycpu_prj1.ip_user_files/ipstatic/simulation/blk_mem_gen_v8_4.v
这个报错很奇怪,实际上也算不上是报错,只不过是运行着的时候一直卡死在Number 8'd09 Functional Test Point PASS!!!,卡的时间长了就出现了FATAL_ERROR。CPU设计实战P119页介绍了出现cpu卡死的情况该怎么去调,结合课本的内容、查看反汇编代码、以及比对golden_trace.txt。找了大半天都没发现问题出在哪里,最后去求助了学长,发现问题出现在alu.v中,里面出现了环路导致CPU卡死。具体原因如下:
assign or_result = alu_src1 | alu_src2 | alu_result;
assign alu_result = ({32{op_add|op_sub}} & add_sub_result)
| ({32{op_slt }} & slt_result)
| ({32{op_sltu }} & sltu_result)
| ({32{op_and }} & and_result)
| ({32{op_nor }} & nor_result)
| ({32{op_or }} & or_result)
| ({32{op_xor }} & xor_result)
| ({32{op_lui }} & lui_result)
| ({32{op_sll }} & sll_result)
| ({32{op_srl|op_sra}} & sr_result);
alu_result的结果由or_result赋值,而or_result的结果却又由alu_result赋值,就这样产生了环路,导致结果出错,修改代码如下:
assign or_result = alu_src1 | alu_src2;
assign alu_result = ({32{op_add|op_sub}} & add_sub_result)
| ({32{op_slt }} & slt_result)
| ({32{op_sltu }} & sltu_result)
| ({32{op_and }} & and_result)
| ({32{op_nor }} & nor_result)
| ({32{op_or }} & or_result)
| ({32{op_xor }} & xor_result)
| ({32{op_lui }} & lui_result)
| ({32{op_sll }} & sll_result)
| ({32{op_srl|op_sra}} & sr_result);
至此第五个bug解决(还是不太清楚怎么调试出来的)。