// ================================================================
// NVDLA Open Source Project
//
// Copyright(c) 2016 - 2017 NVIDIA Corporation. Licensed under the
// NVDLA Open Hardware License; Check "LICENSE" which comes with
// this distribution for more information.
// ================================================================
// File Name: nv_ram_rws_256x64.v
module nv_ram_rws_256x64 (
  clk,	//CLKA, CLKB
  ra,   //AA
  re,   //CENA
  dout, //Q
  wa,   //AB
  we,   //CENB
  di,   //DB
  pwrbus_ram_pd
);
parameter FORCE_CONTENTION_ASSERTION_RESET_ACTIVE=1'b0;
// port list
input clk;
input [7:0] ra;
input re;
output [63:0] dout;
input [7:0] wa;
input we;
input [63:0] di;
input [31:0] pwrbus_ram_pd;

// NC 
// The generated memory is a 2 ported register file, where port B is dedicated write and port
// A is dedicated read
// Requires the following truth table for functional mode
// Write : cena=1 cenb=0 db[M:0]=datain ab[N:0]=write addr  dataout=Q[M:0]=last data 
// Read :  cena=0 cenb=1 db[M:0]=x      aa[N:0]=read  addr  dataout=Q[M:0]=correct data at aa 
// Read/Write : cena=0 cenb=0 db[M:0]=datain ab[N:0]=write addr aa[N:0]=read addr  dataout=Q[M:0]=correct data at aa
// Read/Write : cena=0 cenb=0 db[M:0]=datain ab[N:0]=addr aa[N:0]=addr  dataout=Q[M:0]=unknown    (when concurrent read and write to the same address, write happens correctly, but not read)
// Standby:     cena=1 cenb=1 dataout=Q[M:0]=last data  

wire cena;
wire [7:0]  aa;
wire [63:0] da;

wire cenb;
wire [7:0]  ab;
wire [63:0] db;

assign  dout=da;
assign  cena=(re==1'b1)?1'b0:1'b1;
assign  aa=ra;  // Data is available from the generated memory at the next clk edge after cena is asserted, so no need to register aa or cena

//assign  cenb=~we;
assign  cenb=(we==1'b1)?1'b0:1'b1;
assign  ab=wa;
assign  db=di;


wire ret1n ;	
wire stov;
wire emasa;	// Extra Margin Adjustment read port keeper enable: Default for all voltages
wire [2:0] emaa;	// Extra margin adjustment A: Default for 0.8V
wire [2:0] emab;	// Extra margin adjustment B: Default for 0.8V

assign stov = 1'b0;
assign emasa = 1'b0;	
assign emaa = 3'b010;	// Extra margin adjustment A: Default for 0.8V
assign emab = 3'b010;	// Extra margin adjustment B: Default for 0.8V
assign ret1n = 1'b1;	

//rf_2p_hsc_256x64_nogating rmod (
//                      .QA(da), 
//                      .CLKA(clk), 
//                      .CENA(cena), 
//                      .AA(aa), 
//                      .CLKB(clk),
//                      .CENB(cenb), 
//                      .AB(ab), 
//                      .DB(db), 
//                      .STOV(stov), 
//                      .EMAA(emaa), 
//                      .EMASA(emasa), 
//                      .EMAB(emab), 
//                      .RET1N(ret1n));

//NG45 fakeram
fakeram_256x64_dp rmod (
                      .QA(da), 
                      .CLKA(clk), 
                      .CENA(cena), 
                      .AA(aa), 
                      .CLKB(clk),
                      .CENB(cenb), 
                      .AB(ab), 
                      .DB(db), 
                      .STOV(stov), 
                      .EMAA(emaa), 
                      .EMASA(emasa), 
                      .EMAB(emab), 
                      .RET1N(ret1n));


///Commented out behavioral module
/*
reg [7:0] ra_d;
wire [63:0] dout;
reg [63:0] M [255:0];
always @( posedge clk ) begin
    if (we)
       M[wa] <= di;
end
always @( posedge clk ) begin
    if (re)
       ra_d <= ra;
end
assign dout = M[ra_d];
*/

endmodule