微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请问从这样的SRAM模型设计出来的控制逻辑能正确吗?

请问从这样的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

既然是模型,那是拿来仿真用的,怎么还会去做综合?
综合的时候设置为black box;

这个综合没问题,只是没有时钟来控制,为非同步信号,到时要注意下控制信号和数据之间的时间关系之类的,
我给你发个我用的SRAM,综合仿真都没有问题,简单例化下就行,需要同步时钟的。

  1. module se_perf_ram1p (
  2.      addr,
  3.      clk,
  4.      din,
  5.      dout,
  6.      en,
  7.      we
  8. );
  9. // -----------------------------------------------------------------------------
  10. // Parameters
  11. // -----------------------------------------------------------------------------
  12. parameter WD = 8;       // Width of RAM
  13. parameter PW = 12;      // Size of address
  14. parameter DP = (1<<PW); // Depth of RAM (default is power of 2)
  15. parameter RDSYNC = 1;

  16. input [PW-1:0] addr;
  17. input          clk;
  18. input [WD-1:0] din;
  19. input          en;
  20. input          we;
  21. output [WD-1:0] dout;

  22. reg [WD-1:0]            mem [0:DP-1];   // The memory array
  23. reg [WD-1:0]            dout;


  24. // Writes
  25. always @(posedge clk)
  26. begin
  27.      if (en & we)
  28.          mem[addr]       <= #(`TP) din;
  29.      // synopsys translate_off
  30.      if ((addr >= DP) & (DP > 0))
  31.          $display("%t: Memory (%m) write address error. Address is %x, Max is %x", $time, addr, DP-1);
  32.      // synopsys translate_on
  33. end

  34. // Reads
  35. always @(posedge clk)
  36. begin
  37.      if (en)
  38.          dout            <= #(`TP) mem[addr];
  39.      // synopsys translate_off
  40.      if ((addr >= DP) & (DP > 0))
  41.          $display("%t: Memory (%m) read address error. Address is %x, Max is %x", $time, addr, DP-1);
  42.      // synopsys translate_on
  43. end

  44. endmodule
  45. // leda on

复制代码

谢谢二位回复。
我不是要综合SRAM,而是要设计SRAM以外的电路,比如把SRAM的数据读出来,处理完再存回去。
由于我从来没有用过SRAM,也头一次要设计综合后可用的“真的”设计(不是行为级),心里怕设计出来的东西综合后和真实的SRAM时序不搭配(也就是说即使能综合,功能上却不正确)。

那你找一个能用的SRAM 泡一泡 看看时序不就行了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top