查看: 1680|回复: 0
收起左侧

E203 itcm

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2021-3-5 21:43:42 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

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

    x
    本帖最后由 皋陶 于 2021-3-5 21:43 编辑

    E203 itcm是64Kb,所以地址总线为16位,2^16=64Kb, 数据线宽度为64 bits(8 bytes),所以address width是16-3=13bit,ram depth 是2^16/8=2^13。

          itcm的基地址默认是0x8000_0000。

          在目录e200_opensource/riscv-tools/riscv-tests/isa/generated,这儿有很多生成好的test文件。比如test rv32ui-p-andi

          文件rv32ui-p-andi是riscv的可执行elf文件, rv32ui-p-andi.dump是对应的汇编文件,rv32ui-p-andi.verilog是对于的机器码文件,可以在verilog中用下面的代码把要执行的机器码装入itcm中。

    1. //default itcm size is 64Kb, so E203_ITCM_RAM_DP=13
    2.     reg [7:0] itcm_mem [0:(`E203_ITCM_RAM_DP*8)-1];
    3.     initial begin
    4.       $readmemh({testcase, ".verilog"}, itcm_mem);

    5.       for (i=0;i<(`E203_ITCM_RAM_DP);i=i+1) begin
    6.           `ITCM.mem_r[i][00+7:00] = itcm_mem[i*8+0];
    7.           `ITCM.mem_r[i][08+7:08] = itcm_mem[i*8+1];
    8.           `ITCM.mem_r[i][16+7:16] = itcm_mem[i*8+2];
    9.           `ITCM.mem_r[i][24+7:24] = itcm_mem[i*8+3];
    10.           `ITCM.mem_r[i][32+7:32] = itcm_mem[i*8+4];
    11.           `ITCM.mem_r[i][40+7:40] = itcm_mem[i*8+5];
    12.           `ITCM.mem_r[i][48+7:48] = itcm_mem[i*8+6];
    13.           `ITCM.mem_r[i][56+7:56] = itcm_mem[i*8+7];
    14.       end
    复制代码

    itcm实际上就是一块sram,对itcm的读写如下,读写数据宽度都是按32bit进行的,对于写可以通过write mask只写某个byte。

    1. module sirv_sim_ram
    2. #(parameter DP = 512,
    3.   parameter FORCE_X2ZERO = 0,
    4.   parameter DW = 32,
    5.   parameter MW = 4,
    6.   parameter AW = 32
    7. )
    8. (
    9.   input             clk,
    10.   input  [DW-1  :0] din,//input data
    11.   input  [AW-1  :0] addr,//input address
    12.   input             cs, //chip select
    13.   input             we, //write enable
    14.   input  [MW-1:0]   wem,//write enable mask
    15.   output [DW-1:0]   dout //write data out
    16. );

    17.     reg [DW-1:0] mem_r [0:DP-1];
    18.     reg [AW-1:0] addr_r;
    19.     wire [MW-1:0] wen;
    20.     wire ren;

    21.     assign ren = cs & (~we);
    22.     //it is 4 bits, and every bit mask a byte write
    23.     assign wen = ({MW{cs & we}} & wem);



    24.     genvar i;

    25.     always @(posedge clk)
    26.     begin
    27.         if (ren) begin
    28.             addr_r <= addr;
    29.         end
    30.     end

    31.     generate
    32.       for (i = 0; i < MW; i = i+1) begin :mem
    33.         if((8*i+8) > DW ) begin: last
    34.           always @(posedge clk) begin
    35.             if (wen[i]) begin
    36.                mem_r[addr][DW-1:8*i] <= din[DW-1:8*i];
    37.             end
    38.           end
    39.         end
    40.         else begin: non_last
    41.           always @(posedge clk) begin
    42.             if (wen[i]) begin
    43.                mem_r[addr][8*i+7:8*i] <= din[8*i+7:8*i];
    44.             end
    45.           end
    46.         end
    47.       end
    48.     endgenerate

    49.   wire [DW-1:0] dout_pre;
    50.   assign dout_pre = mem_r[addr_r];

    51.   generate
    52.    if(FORCE_X2ZERO == 1) begin: force_x_to_zero
    53.       for (i = 0; i < DW; i = i+1) begin:force_x_gen
    54.           `ifndef SYNTHESIS//{
    55.          assign dout[i] = (dout_pre[i] === 1'bx) ? 1'b0 : dout_pre[i];
    56.           `else//}{
    57.          assign dout[i] = dout_pre[i];
    58.           `endif//}
    59.       end
    60.    end
    61.    else begin:no_force_x_to_zero
    62.      assign dout = dout_pre;
    63.    end
    64.   endgenerate


    65. endmodule
    复制代码

    testbench文件
    1. module sirv_sim_ram_tb;
    2. reg clk=0;
    3. reg cs=1;
    4. reg we=1;
    5. reg[3:0] wem=4'b1111;
    6. reg[31:0] addr;
    7. reg[31:0] din;

    8. wire[31:0] dout;
    9. integer i,j;


    10. sirv_sim_ram #(
    11.     .FORCE_X2ZERO (1),
    12.     .DP (64),
    13.     .AW (6),
    14.     .MW (4),
    15.     .DW (32)
    16. )u_sirv_sim_ram (
    17.     .clk   (clk),
    18.     .din   (din),
    19.     .addr  (addr),
    20.     .cs    (cs),
    21.     .we    (we),
    22.     .wem   (wem),
    23.     .dout  (dout)
    24. );
    25. always #10 clk = ~clk;

    26. initial
    27. begin
    28. for(i=0; i<16; i=i+1)
    29.         #20 addr=i;
    30. #20
    31. #20 we = 0;
    32. addr = 0;
    33. #20 addr = 1;
    34. #20 addr = 2;
    35. #20 addr = 3;
    36. #20 addr = 4;
    37. #20 addr = 5;
    38. #20 addr = 6;

    39. end

    40. initial
    41. begin
    42. for(j=0; j<16; j=j+1)
    43.         #20 din=j;
    44. end
    45. initial
    46. begin
    47.         //$dumpfile("dump.vcd");
    48.         //$dumpvars;
    49.         $fsdbDumpfile("dump.fsdb");
    50.         $fsdbDumpvars("+all");
    51. end


    52. initial
    53. begin
    54.     $monitor($time,,,"%d,%d,%d,%d,%d,%d)",cs,din,addr,we,wem,dout);
    55.    #1000 $finish;
    56. end
    57. endmodule
    复制代码
    国内芯片技术交流-E203 itcmrisc-v单片机中文社区(1)





    上一篇:开启你RISC-V的开发之旅--RISC-V的linux模拟环境搭建整理和总结
    下一篇:RV32M/RV64M指令集
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-25 01:19 , Processed in 0.716064 second(s), 48 queries .

    快速回复 返回顶部 返回列表