Menu Close

RISC-V 硬件设计常见问题及解答(2)

相关参考文章:

RISC-V教学教案

 

本文将接着RISC-V 硬件设计常见问题及解答(1)继续解答与RISC-V CPU硬件设计相关的问题。

 

1.6.LSU只实现了对GPIO的操作,PC永远指向的都是通用寄存器吗?

LSU 对数据存储器,外设空间(包括GPIO),甚至程序空间进行访问(比如RISC-V 硬件设计常见问题及解答(1)里提到的打印字符串),LSU理论上可以访问32-bit的任何空间。I_PC指向的是程序空间(D_PC指向的是数据及外设空间)而不是通用寄存器;通用寄存器是指x0-x31 ,一般用rs1,rs2,rd作为索引进行访问的。

 

1.7.o_J_PC和o_D_PC分别指向了哪些空间?

O_D_PC可以是数据存储器空间,外设空间或程序(指令)空间,一般指向数据存储器或外设空间,但当要访问的数据位于程序空间时,O_D_PC就指向程序空间。o_J_PC是I_PC中进行JAL/JALR指令跳转的特殊情况,指向程序空间。执行的指令PC如果没有branch或者JAL/JALR,即正常推进,I_PC + 4。

 

1.8.PC值永远不会移到最低两位为01,10,11的地址?这些地址的值是怎样被操作的?

PC的值在32位系统中一般是4 字节对齐的。这里的RISC-V CPU ITCM是用双端口RAM做的,代码如下所示。可以看到,I_PC的最低两位没有接进去(所以对应的指令 + 1, I_PC + 4),其值只有是以4字节为单位的时候,才能得到一条完整的指令。如果一次I_PC只挪动一个字节,那么在RV32I的CPU下,需要推进4次才能读出一条指令,效率很低。数据存储的地址有些不一样(详细解释点击这里),如果需要对一个字节,两个字节的数据进行操作,读数据的处理方法是正常读出,再将寄存器的数据进行移位。写数据时,会用写使能的屏蔽控制。但是也并不禁止在CPU对D_PC的计算产生最低位为01,10,11的地址,解决方法可以是软件移位,或硬件加速移位,将来在C语言设计中会有体现。

TDP_RAM_INSTR  program_inst
(
    .clka   ( sys_clk ),
    .ena    ( 1'b1 ),
    .wea    ( code_wea ),
    .addra  ( code_addr[31:2] ),
    .dina   ( code_din ),
    .douta  ( ),

    .clkb   ( sys_clk ),
    .enb    ( instr_ena ),
    .web    ( 1'b0 ),
    .addrb  ( instr_PC[ 31: 2 ] ), //8K 32bits, 32K byte
    .dinb   ( 32'b0 ),
    .doutb  ( instr )
);

 


1.9.D_SRAM中按字节写和读,是按什么决定的?

是由指令汇编指令决定的,SW,SH,SB, LW, LH(U), LB(U),如图1,2所示。

Store指令

图1 SB,SH,SW指令

load指令

图2 LB(U),LH(U),LW指令

 

1.10.如果按字节写,是不是PC值每次加1就行了?D_SRAM中dout=dout_w>>data_sft;,每次dout接收的是一个字节,是接收一个字节就发出去,还是接收4个字节一块发出去,要是一块发出去,那dout是如何排列dout_w>>data_sft的

注意区分D_PC和I_PC。I_PC只有是以4字节为单位的时候,才能得到一条完整的指令。如果一次I_PC只挪动一个字节,那么在RV32I的CPU下,需要推进4次才能读出一条指令,效率很低。D_PC这里在访问数据空间的时候,没有字节的限制(可以为01,10,11)。这里做了一个数据的移位,根据操作数据的位数(如果不是32位的数据,比如16位,8位,详细解释点击这里)。这里的dout是32位的,即根据数据位数完成移动后,读出的数据就是32位的。再和外层的exu_LSU模块结合,如果对应的指令是LB, 即输出为{ { 24{ dout[ 7 ] } }, dout[ 7: 0 ] };(加上了符号位扩展),以此类推。

Posted in FPGA, RISC-V, RISC-V, RISC-V IPcore设计, RISC-V 教案, 开发板, 教材与教案, 文章

发表评论

相关链接