Public paste
systemVerilog ram
By: silwol | Date: Mar 20 2008 09:08 | Format: None | Expires: never | Size: 1.23 KB | Hits: 1172

  1. module RAM # (
  2.                 parameter int gDataWidth = 32,
  3.                 parameter int gAddrWidth = 8
  4.         )(
  5.                 input logic clk_i, rst_i,
  6.                 input logic [gAddrWidth-1:0] adr_i,
  7.                 input logic [gDataWidth-1:0] dat_i,
  8.                 input logic [gAddrWidth/8-1:0] sel_i,
  9.                 input logic cyc_i, stb_i, we_i,
  10.                 output logic [gDataWidth-1:0] dat_o,
  11.                 output logic ack_o
  12.         );
  13.  
  14.         logic [gDataWidth-1:0] mem[0:(1<<gAddrWidth)-1];
  15.         int nextWs;
  16.  
  17.         class WaitStates;
  18.                 rand int val[1000];
  19.                 local int i = 0;
  20.  
  21.                 constraint v {
  22.                         foreach(val[i]) {
  23.                                 val[i] >= 1;
  24.                                 val[i] < 10;
  25.                         }
  26.                 }
  27.  
  28.                 function int nextVal();
  29.                         int ret = val[i];
  30.                         i = (i+1) % 1000;
  31.                         return ret;
  32.                 endfunction
  33.         endclass
  34.  
  35.         WaitStates ws;
  36.  
  37.         initial begin
  38.                 ws = new;
  39.                 void'(ws.randomize());
  40.         end
  41.        
  42.         always @(posedge clk_i or rst_i)
  43.         begin
  44.                 if (rst_i) begin
  45.                         ack_o = 0;
  46.                         dat_o = '0;
  47.                 end else begin
  48.                         ack_o <= 0;
  49.                         dat_o <= 'x;
  50.  
  51.                         if (cyc_i == 1 && stb_i == 1) begin
  52.                                 nextWs = ws.nextVal();
  53.                                 repeat (nextWs-1) @ (posedge clk_i);
  54.                                 ack_o <= 1;
  55.                                 if (!we_i) begin
  56.                                         dat_o <= mem[adr_i];
  57.                                         @(posedge clk_i);
  58.                                         dat_o <= 'x;
  59.                                 end else begin
  60.                                         @(posedge clk_i);
  61.                                         mem[adr_i] <= dat_i;
  62.                                 end
  63.                                 ack_o <= 0;
  64.                         end
  65.                 end
  66.         end
  67.        
  68. endmodule