bram位宽转换读写仿真 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

bram设置之一

image image image

从32-->128转换。注意勾选了generate address interface with 32bits。

testbench

关键点:A口的地址要以4为递增,因为addra[31:0]是byte地址,而我们又没有使用wea[3:0]进行字节选通。B口的地址是以16为递增

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/06/17 12:44:43
// Design Name: 
// Module Name: test_bram
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


`timescale 1ns / 1ps

module testbench();

  // Inputs
  reg clka;
  reg ena;
  reg [3:0] wea;
  reg [31:0] addra;
  reg [31:0] dina;
  wire [31:0] douta;

  reg clkb;
  reg enb;
  reg [15:0] web;
  reg [31:0] addrb;
  reg [127:0] dinb;
  wire [127:0] doutb;

  // Instantiate the Unit Under Test (UUT)
  blk_mem_gen_0 uut (
    .clka(clka),
    .ena(ena),
    .wea(wea),
    .addra(addra),
    .dina(dina),
    .douta(douta),
    .clkb(clkb),
    .enb(enb),
    .web(web),
    .addrb(addrb),
    .dinb(dinb),
    .doutb(doutb)
  );

  // Clock generation
  initial begin
    clka = 0;
    forever #5 clka = ~clka; // 100 MHz clock
  end

  initial begin
    clkb = 0;
    forever #5 clkb = ~clkb; // 100 MHz clock
  end

  // Test sequence
  initial begin
    // Initialize Inputs
    ena = 0;
    wea = 0;
    addra = 0;
    dina = 0;
    enb = 0;
    web = 0;
    addrb = 0;
    dinb = 0;

    // Wait for global reset to finish
    #100;

    // A port write: Write 1024 bytes (256 words) sequentially
    ena = 1;
    wea = 4'b1111; // Enable write on A port
    for (integer i = 0; i < 1024; i = i + 4) begin
      addra = i;
      dina[7:0] = i; // Write incrementing pattern
      dina[15:8]=i+1;
      dina[23:16]=i+2;
      dina[31:24]=i+3;
      #10; // Wait for one clock cycle
    end
    wea = 0; // Disable write on A port

    // Wait a few cycles
    #50;
    
    
        // B port read: Read 128 bytes (8 words of 128 bits) sequentially
    ena = 1;
    for (integer j = 0; j < 1024; j = j + 4) begin
      addra = j;
      #10;
      // Check read data
      $display("Read data[%0d]: %h", addra, douta);
    end
    ena=0;
    
     #50;

    // B port read: Read 128 bytes (8 words of 128 bits) sequentially
    enb = 1;
    for (integer j = 0; j < 16; j = j + 1) begin
      addrb = j*16;
      #10;
      // Check read data
      $display("Read data[%0d]: %h", addrb, doutb);
    end
    enb=0;

    // Finish simulation
    $stop;
  end

endmodule


仿真波形和结果

可以看到结果是正确的。

run 100 us
Read data[0]: 03020100
Read data[4]: 07060504
Read data[8]: 0b0a0908
Read data[12]: 0f0e0d0c
Read data[16]: 13121110
Read data[20]: 17161514
Read data[24]: 1b1a1918
Read data[28]: 1f1e1d1c
Read data[32]: 23222120
Read data[36]: 27262524
Read data[40]: 2b2a2928
Read data[44]: 2f2e2d2c
Read data[48]: 33323130
Read data[52]: 37363534
Read data[56]: 3b3a3938
Read data[60]: 3f3e3d3c
Read data[64]: 43424140
Read data[68]: 47464544
Read data[72]: 4b4a4948
Read data[76]: 4f4e4d4c
Read data[80]: 53525150
Read data[84]: 57565554
Read data[88]: 5b5a5958
Read data[92]: 5f5e5d5c
Read data[96]: 63626160
Read data[100]: 67666564
Read data[104]: 6b6a6968
Read data[108]: 6f6e6d6c
Read data[112]: 73727170
Read data[116]: 77767574
Read data[120]: 7b7a7978
Read data[124]: 7f7e7d7c
Read data[128]: 83828180
Read data[132]: 87868584
Read data[136]: 8b8a8988
Read data[140]: 8f8e8d8c
Read data[144]: 93929190
Read data[148]: 97969594
Read data[152]: 9b9a9998
Read data[156]: 9f9e9d9c
Read data[160]: a3a2a1a0
Read data[164]: a7a6a5a4
Read data[168]: abaaa9a8
Read data[172]: afaeadac
Read data[176]: b3b2b1b0
Read data[180]: b7b6b5b4
Read data[184]: bbbab9b8
Read data[188]: bfbebdbc
Read data[192]: c3c2c1c0
Read data[196]: c7c6c5c4
Read data[200]: cbcac9c8
Read data[204]: cfcecdcc
Read data[208]: d3d2d1d0
Read data[212]: d7d6d5d4
Read data[216]: dbdad9d8
Read data[220]: dfdedddc
Read data[224]: e3e2e1e0
Read data[228]: e7e6e5e4
Read data[232]: ebeae9e8
Read data[236]: efeeedec
Read data[240]: f3f2f1f0
Read data[244]: f7f6f5f4
Read data[248]: fbfaf9f8
Read data[252]: fffefdfc
Read data[256]: 03020100
Read data[260]: 07060504
Read data[264]: 0b0a0908
Read data[268]: 0f0e0d0c
Read data[272]: 13121110
Read data[276]: 17161514
Read data[280]: 1b1a1918
Read data[284]: 1f1e1d1c
Read data[288]: 23222120
Read data[292]: 27262524
Read data[296]: 2b2a2928
Read data[300]: 2f2e2d2c
Read data[304]: 33323130
Read data[308]: 37363534
Read data[312]: 3b3a3938
Read data[316]: 3f3e3d3c
Read data[320]: 43424140
Read data[324]: 47464544
Read data[328]: 4b4a4948
Read data[332]: 4f4e4d4c
Read data[336]: 53525150
Read data[340]: 57565554
Read data[344]: 5b5a5958
Read data[348]: 5f5e5d5c
Read data[352]: 63626160
Read data[356]: 67666564
Read data[360]: 6b6a6968
Read data[364]: 6f6e6d6c
Read data[368]: 73727170
Read data[372]: 77767574
Read data[376]: 7b7a7978
Read data[380]: 7f7e7d7c
Read data[384]: 83828180
Read data[388]: 87868584
Read data[392]: 8b8a8988
Read data[396]: 8f8e8d8c
Read data[400]: 93929190
Read data[404]: 97969594
Read data[408]: 9b9a9998
Read data[412]: 9f9e9d9c
Read data[416]: a3a2a1a0
Read data[420]: a7a6a5a4
Read data[424]: abaaa9a8
Read data[428]: afaeadac
Read data[432]: b3b2b1b0
Read data[436]: b7b6b5b4
Read data[440]: bbbab9b8
Read data[444]: bfbebdbc
Read data[448]: c3c2c1c0
Read data[452]: c7c6c5c4
Read data[456]: cbcac9c8
Read data[460]: cfcecdcc
Read data[464]: d3d2d1d0
Read data[468]: d7d6d5d4
Read data[472]: dbdad9d8
Read data[476]: dfdedddc
Read data[480]: e3e2e1e0
Read data[484]: e7e6e5e4
Read data[488]: ebeae9e8
Read data[492]: efeeedec
Read data[496]: f3f2f1f0
Read data[500]: f7f6f5f4
Read data[504]: fbfaf9f8
Read data[508]: fffefdfc
Read data[512]: 03020100
Read data[516]: 07060504
Read data[520]: 0b0a0908
Read data[524]: 0f0e0d0c
Read data[528]: 13121110
Read data[532]: 17161514
Read data[536]: 1b1a1918
Read data[540]: 1f1e1d1c
Read data[544]: 23222120
Read data[548]: 27262524
Read data[552]: 2b2a2928
Read data[556]: 2f2e2d2c
Read data[560]: 33323130
Read data[564]: 37363534
Read data[568]: 3b3a3938
Read data[572]: 3f3e3d3c
Read data[576]: 43424140
Read data[580]: 47464544
Read data[584]: 4b4a4948
Read data[588]: 4f4e4d4c
Read data[592]: 53525150
Read data[596]: 57565554
Read data[600]: 5b5a5958
Read data[604]: 5f5e5d5c
Read data[608]: 63626160
Read data[612]: 67666564
Read data[616]: 6b6a6968
Read data[620]: 6f6e6d6c
Read data[624]: 73727170
Read data[628]: 77767574
Read data[632]: 7b7a7978
Read data[636]: 7f7e7d7c
Read data[640]: 83828180
Read data[644]: 87868584
Read data[648]: 8b8a8988
Read data[652]: 8f8e8d8c
Read data[656]: 93929190
Read data[660]: 97969594
Read data[664]: 9b9a9998
Read data[668]: 9f9e9d9c
Read data[672]: a3a2a1a0
Read data[676]: a7a6a5a4
Read data[680]: abaaa9a8
Read data[684]: afaeadac
Read data[688]: b3b2b1b0
Read data[692]: b7b6b5b4
Read data[696]: bbbab9b8
Read data[700]: bfbebdbc
Read data[704]: c3c2c1c0
Read data[708]: c7c6c5c4
Read data[712]: cbcac9c8
Read data[716]: cfcecdcc
Read data[720]: d3d2d1d0
Read data[724]: d7d6d5d4
Read data[728]: dbdad9d8
Read data[732]: dfdedddc
Read data[736]: e3e2e1e0
Read data[740]: e7e6e5e4
Read data[744]: ebeae9e8
Read data[748]: efeeedec
Read data[752]: f3f2f1f0
Read data[756]: f7f6f5f4
Read data[760]: fbfaf9f8
Read data[764]: fffefdfc
Read data[768]: 03020100
Read data[772]: 07060504
Read data[776]: 0b0a0908
Read data[780]: 0f0e0d0c
Read data[784]: 13121110
Read data[788]: 17161514
Read data[792]: 1b1a1918
Read data[796]: 1f1e1d1c
Read data[800]: 23222120
Read data[804]: 27262524
Read data[808]: 2b2a2928
Read data[812]: 2f2e2d2c
Read data[816]: 33323130
Read data[820]: 37363534
Read data[824]: 3b3a3938
Read data[828]: 3f3e3d3c
Read data[832]: 43424140
Read data[836]: 47464544
Read data[840]: 4b4a4948
Read data[844]: 4f4e4d4c
Read data[848]: 53525150
Read data[852]: 57565554
Read data[856]: 5b5a5958
Read data[860]: 5f5e5d5c
Read data[864]: 63626160
Read data[868]: 67666564
Read data[872]: 6b6a6968
Read data[876]: 6f6e6d6c
Read data[880]: 73727170
Read data[884]: 77767574
Read data[888]: 7b7a7978
Read data[892]: 7f7e7d7c
Read data[896]: 83828180
Read data[900]: 87868584
Read data[904]: 8b8a8988
Read data[908]: 8f8e8d8c
Read data[912]: 93929190
Read data[916]: 97969594
Read data[920]: 9b9a9998
Read data[924]: 9f9e9d9c
Read data[928]: a3a2a1a0
Read data[932]: a7a6a5a4
Read data[936]: abaaa9a8
Read data[940]: afaeadac
Read data[944]: b3b2b1b0
Read data[948]: b7b6b5b4
Read data[952]: bbbab9b8
Read data[956]: bfbebdbc
Read data[960]: c3c2c1c0
Read data[964]: c7c6c5c4
Read data[968]: cbcac9c8
Read data[972]: cfcecdcc
Read data[976]: d3d2d1d0
Read data[980]: d7d6d5d4
Read data[984]: dbdad9d8
Read data[988]: dfdedddc
Read data[992]: e3e2e1e0
Read data[996]: e7e6e5e4
Read data[1000]: ebeae9e8
Read data[1004]: efeeedec
Read data[1008]: f3f2f1f0
Read data[1012]: f7f6f5f4
Read data[1016]: fbfaf9f8
Read data[1020]: fffefdfc
Read data[0]: 0f0e0d0c0b0a09080706050403020100
Read data[16]: 1f1e1d1c1b1a19181716151413121110
Read data[32]: 2f2e2d2c2b2a29282726252423222120
Read data[48]: 3f3e3d3c3b3a39383736353433323130
Read data[64]: 4f4e4d4c4b4a49484746454443424140
Read data[80]: 5f5e5d5c5b5a59585756555453525150
Read data[96]: 6f6e6d6c6b6a69686766656463626160
Read data[112]: 7f7e7d7c7b7a79787776757473727170
Read data[128]: 8f8e8d8c8b8a89888786858483828180
Read data[144]: 9f9e9d9c9b9a99989796959493929190
Read data[160]: afaeadacabaaa9a8a7a6a5a4a3a2a1a0
Read data[176]: bfbebdbcbbbab9b8b7b6b5b4b3b2b1b0
Read data[192]: cfcecdcccbcac9c8c7c6c5c4c3c2c1c0
Read data[208]: dfdedddcdbdad9d8d7d6d5d4d3d2d1d0
Read data[224]: efeeedecebeae9e8e7e6e5e4e3e2e1e0
Read data[240]: fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0

bram设置之二

image image image

从32-->1024转换。注意不勾选generate address interface with 32bits。 只有不勾选byte write enable,B口才可以配置到1024这么大的位宽。

testbench

`timescale 1ns / 1ps

module testbench();

  // Inputs
  reg clka;
  reg ena;
  reg [0:0] wea;
  reg [6:0] addra;
  reg [31:0] dina;
  wire [31:0] douta;

  reg clkb;
  reg enb;
  reg [0:0] web;
  reg [1:0] addrb;
  reg [1023:0] dinb;
  wire [1023:0] doutb;

  // Instantiate the Unit Under Test (UUT)
blk_mem_gen_0 your_instance_name (
  .clka(clka),    // input wire clka
  .ena(ena),      // input wire ena
  .wea(wea),      // input wire [0 : 0] wea
  .addra(addra),  // input wire [6 : 0] addra
  .dina(dina),    // input wire [31 : 0] dina
  .douta(douta),  // output wire [31 : 0] douta
  .clkb(clkb),    // input wire clkb
  .enb(enb),      // input wire enb
  .web(web),      // input wire [0 : 0] web
  .addrb(addrb),  // input wire [1 : 0] addrb
  .dinb(dinb),    // input wire [1023 : 0] dinb
  .doutb(doutb)  // output wire [1023 : 0] doutb
);

  // Clock generation
  initial begin
    clka = 0;
    forever #5 clka = ~clka; // 100 MHz clock
  end

  initial begin
    clkb = 0;
    forever #5 clkb = ~clkb; // 100 MHz clock
  end

  // Test sequence
  initial begin
    // Initialize Inputs
    ena = 0;
    wea = 0;
    addra = 0;
    dina = 0;
    enb = 0;
    web = 0;
    addrb = 0;
    dinb = 0;

    // Wait for global reset to finish
    #100;

    // A port write: Write 1024 bytes (256 words) sequentially
    ena = 1;
    wea = 1; // Enable write on A port
    for (integer i = 0; i < 128; i = i + 1) begin
      addra = i;
      dina[7:0] = i; // Write incrementing pattern
      dina[15:8]=i+1;
      dina[23:16]=i+2;
      dina[31:24]=i+3;
      #10; // Wait for one clock cycle
    end
    wea = 0; // Disable write on A port

    // Wait a few cycles
    #50;
    
    
        // B port read: Read 128 bytes (8 words of 128 bits) sequentially
    ena = 1;
    for (integer j = 0; j < 128; j = j + 1) begin
      addra = j;
      #10;
      // Check read data
      $display("Read data[%0d]: %h", addra, douta);
    end
    ena=0;
    
     #50;

    // B port read: Read 128 bytes (8 words of 128 bits) sequentially
    enb = 1;
    for (integer j = 0; j < 2; j = j + 1) begin
      addrb = j;
      #10;
      // Check read data
      $display("Read data[%0d]: %h", addrb, doutb);
    end
    enb=0;

    // Finish simulation
    $stop;
  end

endmodule

仿真结果

run 100 us
Read data[0]: 03020100
Read data[1]: 04030201
Read data[2]: 05040302
Read data[3]: 06050403
Read data[4]: 07060504
Read data[5]: 08070605
Read data[6]: 09080706
Read data[7]: 0a090807
Read data[8]: 0b0a0908
Read data[9]: 0c0b0a09
Read data[10]: 0d0c0b0a
Read data[11]: 0e0d0c0b
Read data[12]: 0f0e0d0c
Read data[13]: 100f0e0d
Read data[14]: 11100f0e
Read data[15]: 1211100f
Read data[16]: 13121110
Read data[17]: 14131211
Read data[18]: 15141312
Read data[19]: 16151413
Read data[20]: 17161514
Read data[21]: 18171615
Read data[22]: 19181716
Read data[23]: 1a191817
Read data[24]: 1b1a1918
Read data[25]: 1c1b1a19
Read data[26]: 1d1c1b1a
Read data[27]: 1e1d1c1b
Read data[28]: 1f1e1d1c
Read data[29]: 201f1e1d
Read data[30]: 21201f1e
Read data[31]: 2221201f
Read data[32]: 23222120
Read data[33]: 24232221
Read data[34]: 25242322
Read data[35]: 26252423
Read data[36]: 27262524
Read data[37]: 28272625
Read data[38]: 29282726
Read data[39]: 2a292827
Read data[40]: 2b2a2928
Read data[41]: 2c2b2a29
Read data[42]: 2d2c2b2a
Read data[43]: 2e2d2c2b
Read data[44]: 2f2e2d2c
Read data[45]: 302f2e2d
Read data[46]: 31302f2e
Read data[47]: 3231302f
Read data[48]: 33323130
Read data[49]: 34333231
Read data[50]: 35343332
Read data[51]: 36353433
Read data[52]: 37363534
Read data[53]: 38373635
Read data[54]: 39383736
Read data[55]: 3a393837
Read data[56]: 3b3a3938
Read data[57]: 3c3b3a39
Read data[58]: 3d3c3b3a
Read data[59]: 3e3d3c3b
Read data[60]: 3f3e3d3c
Read data[61]: 403f3e3d
Read data[62]: 41403f3e
Read data[63]: 4241403f
Read data[64]: 43424140
Read data[65]: 44434241
Read data[66]: 45444342
Read data[67]: 46454443
Read data[68]: 47464544
Read data[69]: 48474645
Read data[70]: 49484746
Read data[71]: 4a494847
Read data[72]: 4b4a4948
Read data[73]: 4c4b4a49
Read data[74]: 4d4c4b4a
Read data[75]: 4e4d4c4b
Read data[76]: 4f4e4d4c
Read data[77]: 504f4e4d
Read data[78]: 51504f4e
Read data[79]: 5251504f
Read data[80]: 53525150
Read data[81]: 54535251
Read data[82]: 55545352
Read data[83]: 56555453
Read data[84]: 57565554
Read data[85]: 58575655
Read data[86]: 59585756
Read data[87]: 5a595857
Read data[88]: 5b5a5958
Read data[89]: 5c5b5a59
Read data[90]: 5d5c5b5a
Read data[91]: 5e5d5c5b
Read data[92]: 5f5e5d5c
Read data[93]: 605f5e5d
Read data[94]: 61605f5e
Read data[95]: 6261605f
Read data[96]: 63626160
Read data[97]: 64636261
Read data[98]: 65646362
Read data[99]: 66656463
Read data[100]: 67666564
Read data[101]: 68676665
Read data[102]: 69686766
Read data[103]: 6a696867
Read data[104]: 6b6a6968
Read data[105]: 6c6b6a69
Read data[106]: 6d6c6b6a
Read data[107]: 6e6d6c6b
Read data[108]: 6f6e6d6c
Read data[109]: 706f6e6d
Read data[110]: 71706f6e
Read data[111]: 7271706f
Read data[112]: 73727170
Read data[113]: 74737271
Read data[114]: 75747372
Read data[115]: 76757473
Read data[116]: 77767574
Read data[117]: 78777675
Read data[118]: 79787776
Read data[119]: 7a797877
Read data[120]: 7b7a7978
Read data[121]: 7c7b7a79
Read data[122]: 7d7c7b7a
Read data[123]: 7e7d7c7b
Read data[124]: 7f7e7d7c
Read data[125]: 807f7e7d
Read data[126]: 81807f7e
Read data[127]: 8281807f
Read data[0]: 2221201f21201f1e201f1e1d1f1e1d1c1e1d1c1b1d1c1b1a1c1b1a191b1a19181a191817191817161817161517161514161514131514131214131211131211101211100f11100f0e100f0e0d0f0e0d0c0e0d0c0b0d0c0b0a0c0b0a090b0a09080a09080709080706080706050706050406050403050403020403020103020100
Read data[1]: 4241403f41403f3e403f3e3d3f3e3d3c3e3d3c3b3d3c3b3a3c3b3a393b3a39383a393837393837363837363537363534363534333534333234333231333231303231302f31302f2e302f2e2d2f2e2d2c2e2d2c2b2d2c2b2a2c2b2a292b2a29282a29282729282726282726252726252426252423252423222423222123222120