vivado ram核同时读写疑问

当创建ram核之后, 如果ab两个端口,使能同时有效,而且地址都是相同地址。换句话说,对ram地址同时读写, b端口会输出什么值?
结果是,要么是ram中原先存储的值, 要么是刚刚写进去的值。
创建单口ram核 时候,
选择的是write first。 common clock 不打勾。 primitive output register打勾。
下面是测试文件。 因为设置了write first。所以,当同时读写一个ram 地址时,读出的数据是刚刚写进去的值。当ram地址发送改变的时候,下一个时钟不会出数据,要再过一个时钟,ram中 数据才会出来。

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/01/30 08:07:49
// Design Name:
// Module Name: ramIP_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module ramIP_tb();

reg clk,clkTFT; //50M , 33M
initial clk = 1;
initial clkTFT = 1;
always #10 clk = ~clk;
always #15 clkTFT = ~clkTFT;

reg rst_n;
reg [15:0] din;
reg wea, enb;
reg [15:0] addra;
reg [15:0] addrb;
wire [15:0] dout;
initial begin
rst_n = 0;
din = 0;
enb = 0;
addra = 0;
addrb = 0;
#303;
rst_n = 1;
//把ram写满
repeat(65536) begin
wea=1;
#20;
din =din +1;
addra = addra+ 1;
end
wea=0;

// #10000;
#9997; enb=1;
#3;
//读ram
repeat(65536) begin
#30;
addrb = addrb+ 1;
end
#30;
enb=0;
#10000;

  //读写同时有效,发现读出来的数据是刚刚写进去的值。
  addra=16'h0000;
  din = 16'h1111;
  wea=1;
  enb=1;
  #100;
  wea=0;
  enb=0;
  #1000;

  enb=1;
  #100;
  enb=0;

  #10000;
  $stop;

end

ram16X64K ram(.clka(clk),
.ena(1),
.wea(wea),
.addra(addra),
.dina(din),
.clkb(clkTFT),
.enb(enb),
.addrb(addrb),
.doutb(dout)
);
endmodule

猜你喜欢

转载自blog.51cto.com/14018328/2611945