请问从这样的SRAM模型设计出来的控制逻辑能正确吗?
时间:10-02
整理:3721RD
点击:
就是这样的一个模型,我是要实现一个能用的接口和计算模块。
但是听说真实的存储器access latency和delay都是更复杂,我就怕设计来设计去,综合后的电路无法和真正SRAM的读写时许匹配。
请问如下的简单模型能用吗?
module SRAM (Address, Data, CS, WE, OE);
parameter AddressSize = 12;
parameter WordSize = 8;
input [AddressSize-1:0] Address;
inout [WordSize-1:0] Data;
input CS, WE, OE;
integer i;
reg [WordSize-1:0] Mem [0:1<<AddressSize];
initial
begin
$readmemb("C:/Users/Administrator/Desktop/sram.txt", Mem);
for(i=0;i<8;i=i+1)
$display("Mem=%b",Mem[i]);
end
assign Data = (!CS && !OE) ? Mem[Address] : {WordSize{1'bz}} ; // Very important, don't forget this "z"
always @(CS or WE)
if (!CS && !WE) // CS, WE, OE are all active low
Mem[Address] = Data;
always @(WE or OE)
if (!WE && !OE)
$display("Operational error in RamChip: OE and WE both active");
endmodule
但是听说真实的存储器access latency和delay都是更复杂,我就怕设计来设计去,综合后的电路无法和真正SRAM的读写时许匹配。
请问如下的简单模型能用吗?
module SRAM (Address, Data, CS, WE, OE);
parameter AddressSize = 12;
parameter WordSize = 8;
input [AddressSize-1:0] Address;
inout [WordSize-1:0] Data;
input CS, WE, OE;
integer i;
reg [WordSize-1:0] Mem [0:1<<AddressSize];
initial
begin
$readmemb("C:/Users/Administrator/Desktop/sram.txt", Mem);
for(i=0;i<8;i=i+1)
$display("Mem=%b",Mem[i]);
end
assign Data = (!CS && !OE) ? Mem[Address] : {WordSize{1'bz}} ; // Very important, don't forget this "z"
always @(CS or WE)
if (!CS && !WE) // CS, WE, OE are all active low
Mem[Address] = Data;
always @(WE or OE)
if (!WE && !OE)
$display("Operational error in RamChip: OE and WE both active");
endmodule
既然是模型,那是拿来仿真用的,怎么还会去做综合?
综合的时候设置为black box;
这个综合没问题,只是没有时钟来控制,为非同步信号,到时要注意下控制信号和数据之间的时间关系之类的,
我给你发个我用的SRAM,综合仿真都没有问题,简单例化下就行,需要同步时钟的。
- module se_perf_ram1p (
- addr,
- clk,
- din,
- dout,
- en,
- we
- );
- // -----------------------------------------------------------------------------
- // Parameters
- // -----------------------------------------------------------------------------
- parameter WD = 8; // Width of RAM
- parameter PW = 12; // Size of address
- parameter DP = (1<<PW); // Depth of RAM (default is power of 2)
- parameter RDSYNC = 1;
-
- input [PW-1:0] addr;
- input clk;
- input [WD-1:0] din;
- input en;
- input we;
- output [WD-1:0] dout;
-
- reg [WD-1:0] mem [0:DP-1]; // The memory array
- reg [WD-1:0] dout;
-
-
- // Writes
- always @(posedge clk)
- begin
- if (en & we)
- mem[addr] <= #(`TP) din;
- // synopsys translate_off
- if ((addr >= DP) & (DP > 0))
- $display("%t: Memory (%m) write address error. Address is %x, Max is %x", $time, addr, DP-1);
- // synopsys translate_on
- end
-
- // Reads
- always @(posedge clk)
- begin
- if (en)
- dout <= #(`TP) mem[addr];
- // synopsys translate_off
- if ((addr >= DP) & (DP > 0))
- $display("%t: Memory (%m) read address error. Address is %x, Max is %x", $time, addr, DP-1);
- // synopsys translate_on
- end
-
- endmodule
- // leda on
谢谢二位回复。
我不是要综合SRAM,而是要设计SRAM以外的电路,比如把SRAM的数据读出来,处理完再存回去。
由于我从来没有用过SRAM,也头一次要设计综合后可用的“真的”设计(不是行为级),心里怕设计出来的东西综合后和真实的SRAM时序不搭配(也就是说即使能综合,功能上却不正确)。
那你找一个能用的SRAM 泡一泡 看看时序不就行了
