在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 17690|回复: 15

[讨论] 《自己动手写CPU》进来看下

[复制链接]
发表于 2014-8-18 12:14:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 ran_newstar 于 2014-8-18 13:13 编辑

// pc_reg例化

pc_reg pc_reg0(

.clk(clk),
.rst(rst),
.pc(pc),    .ce(rom_ce_o)

);
/////////////////////////////////////////////////////////////////////////////////////////
// 例化处理器OpenMIPS

openmips openmips0(
                 .clk(clk),
.rst(rst),
                 .rom_addr_o(inst_addr),
.rom_data_i(inst),
                 .rom_ce(rom_ce)

);


// 例化指令存储器ROM

inst_rom inst_rom0(

.ce(rom_ce),

.addr(inst_addr),
.inst(inst)

);

作者,testbench中的例化与模块定义中的例化对应不起来。
pc_reg例化中的.pc例化是pc,而例化指令存储器ROM中的.addr却是inst_addr,对应不起来。如果以从属于最先定义的一致,那么应当用pc而非inst_addr。
pc_reg例化中的.ce例化是rom_ce_o,而例化指令存储器ROM中的.ce却是rom_ce,对应不起来。如果以从属于最先定义的一致,那么应当用rom_ce_o而非rom_ce
类似地,
openmips和ROM例化中的inst应该为rom_data_i,因为IF/ID模块的例化中用的是rom_data_i。


作者,你怎么看?
 楼主| 发表于 2014-8-18 20:38:11 | 显示全部楼层
还请雷大侠看下
发表于 2014-8-19 13:15:41 | 显示全部楼层
本帖最后由 leishangwen 于 2014-8-19 13:20 编辑

回复 1# ran_newstar


   PC是OpenMIPS处理器中的一个模块,在OpenMIPS内部例化,指令ROM是OpenMIPS处理器外部的,
   ROM与OpenMIPS同属于小型SOPC,它们两者的接口是互联的,与PC模块没有关系。
未命名.bmp
 楼主| 发表于 2014-8-19 16:12:39 | 显示全部楼层


我指的是括号内的名称。比如.ce(rom_ce_o)里的rom_ce_o,这个好像是wire型.名称有不匹配的。如果改成匹配能不能正常运行?
发表于 2014-8-19 23:44:45 | 显示全部楼层
回复 4# ran_newstar


   怎么个不匹配,请详细说明一下?
 楼主| 发表于 2014-8-20 00:10:41 | 显示全部楼层
看了你书前部分,就我理解,括号内的起了模块之间连接的作用。他们的名称应该要一致啊。
你的代码里没有一致。
具体如下:
pc_reg例化中的.pc例化是pc,而例化指令存储器ROM中的.addr却是inst_addr,对应不起来。如果以从属于最先定义的一致,那么应当用pc而非inst_addr。
pc_reg例化中的.ce例化是rom_ce_o,而例化指令存储器ROM中的.ce却是rom_ce,对应不起来。如果以从属于最先定义的一致,那么应当用rom_ce_o而非rom_ce。
类似地,
openmips和ROM例化中的inst应该为rom_data_i,因为IF/ID模块的例化中用的是rom_data_i。
发表于 2014-8-20 13:24:33 | 显示全部楼层
回复 6# ran_newstar

“括号内的起了模块之间连接的作用。他们的名称应该要一致啊。 ”这句话是对的,但是你对PC、OpenMIPS、ROM这几个模块的关系理解是错误的,PC模块是位于OpenMIPS内部的,并不直接与ROM相连,而是通过OpenMIPS的接口与ROM连接,可以参考下面这个图理解。


attachment.bmp
发表于 2014-8-20 13:26:05 | 显示全部楼层
IF/ID模块也是位于OpenMIPS内部,并不直接与外部的ROM连接,还是通过OpenMIPS模块与ROM连接,你可以读读OpenMIPS的代码,里面有IF/ID、PC模块的例化语句。
 楼主| 发表于 2014-8-28 00:30:19 | 显示全部楼层
本帖最后由 ran_newstar 于 2014-8-29 16:48 编辑


IF/ID模块也是位于OpenMIPS内部,并不直接与外部的ROM连接,还是通过OpenMIPS模块与ROM连接,你可以读读Ope ...
leishangwen 发表于 2014-8-20 13:26




    1.JPG 雷大侠,我还是有点疑问。
图上可以看出ROM有与IF/ID和PC模块连接的。
opemnmips.v代码里
//IF/ID阶段寄存器

if_id if_id0(

.clk(clk),

.rst(rst),

.stall(stall),

.flush(flush),

.if_pc(pc),                                //从PC来,用了pc,根据图对应的PC也应该有pc,PC的确有pc,能对应

.if_inst(rom_data_i),          //从ROM来,用了rom_data_i,根据图对应的ROM也应该有这个rom_data_i,没对应

.id_pc(id_pc_i),

.id_inst(id_inst_i)      


);

  //pc_reg例化

pc_reg pc_reg0(

.clk(clk),

.rst(rst),

.stall(stall),

  .flush(flush),

  .new_pc(new_pc),

.branch_flag_i(id_branch_flag_o),

.branch_target_address_i(branch_target_address),

.pc(pc)
//这里与IF/ID和ROM连,与IF/ID能对应,与ROM不能对应,ROM用了inst_addr



);


  assign rom_addr_o = pc;

在openmips_min_sopc.v代码里:
openmips openmips0(

.clk(clk),

.rst(rst),



.rom_addr_o(inst_addr),               //到ROM去,用了inst_addr,可以与ROM对应

.rom_data_i(inst),                          //从ROM而来,用了inst,可以与ROM对应

  
.int_i(int),


.ram_we_o(mem_we_i),

.ram_addr_o(mem_addr_i),

.ram_sel_o(mem_sel_i),

.ram_data_o(mem_data_i),

.ram_data_i(mem_data_o),



.timer_int_o(timer_int)




);



inst_rom inst_rom0(

.rst(rst),

.addr(inst_addr),

.inst(inst)


);
发表于 2014-9-16 13:33:41 | 显示全部楼层
本帖最后由 leishangwen 于 2014-9-16 13:38 编辑

回复 9# ran_newstar


    这个图是把ROM画在了OpenMIPS内部(便于理解),实际上ROM是位于OpenMIPS外部的,ROM与OpenMIPS连接,而不是与PC、IF/ID模块连接,PC、IF/ID位于OpenMIPS内部,这个关系你一定要搞清楚,才可理解,感觉你现在对这个的关系还是不清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-26 15:42 , Processed in 0.044685 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表