CPU设计实战 第四章实践任务一 第五个bug

文章描述了一个在CPU设计过程中遇到的异常情况,具体表现为在Number8d09FunctionalTestPoint时卡死并引发FATAL_ERROR。经过分析和调试,发现错误源在于ALU模块的Verilog代码中存在环路赋值,导致CPU无法正常运行。修复方法是消除alu_result和or_result间的环路依赖,从而解决了问题。
摘要由CSDN通过智能技术生成

----[ 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解决(还是不太清楚怎么调试出来的)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值