lin-win-share/DA4008_V1.3/rtl/memory/tsmc_dpram.v

173 lines
12 KiB
Verilog

module tsmc_dpram #(
parameter DATAWIDTH = 32
,parameter ADDRWIDTH = 14
)(
input PortClk
,input [ADDRWIDTH-1 :0] PortAAddr
,input [DATAWIDTH-1 :0] PortADataIn
,input PortAWriteEnable //active low
,input PortAChipEnable //active low
,input [(DATAWIDTH/8)-1 :0] PortAByteWriteEnable //active low
,output [DATAWIDTH-1 :0] PortADataOut
,input [ADDRWIDTH-1 :0] PortBAddr
,input [DATAWIDTH-1 :0] PortBDataIn
,input PortBWriteEnable //active low
,input PortBChipEnable //active low
,input [(DATAWIDTH/8)-1 :0] PortBByteWriteEnable //active low
,output [DATAWIDTH-1 :0] PortBDataOut
);
////////////////////////////////////////////////////////////////////////////////
//Function
////////////////////////////////////////////////////////////////////////////////
function integer clog2(input integer bit_depth);
begin
for(clog2=0;bit_depth>0;clog2=clog2+1)
bit_depth =bit_depth>>1;
end
endfunction
localparam LSB = clog2(DATAWIDTH/8 -1);
generate
if((DATAWIDTH == 512) && (ADDRWIDTH == 19)) begin:spram_512X8192_generation
genvar i;
wire [DATAWIDTH-1:0] BWEBA ;
wire [DATAWIDTH-1:0] BWEBB ;
for(i = 0; i < DATAWIDTH/8; i = i + 1) begin
assign BWEBA[8*i +: 8] = {8{PortAByteWriteEnable[i]}};
assign BWEBB[8*i +: 8] = {8{PortBByteWriteEnable[i]}};
end
genvar k;
wire [1 :0] U_CEBA;
wire [1 :0] U_CEBB;
wire [DATAWIDTH-1:0] U_QA[1 :0];
wire [DATAWIDTH-1:0] U_QB[1 :0];
reg [1 :0] AA_1D_MSB;
reg [1 :0] AB_1D_MSB;
for(k = 0; k < 2; k = k + 1) begin
assign U_CEBA[k] = ~(PortAAddr[ADDRWIDTH-1] == k) | PortAChipEnable;
assign U_CEBB[k] = ~(PortBAddr[ADDRWIDTH-1] == k) | PortBChipEnable;
tsdn28hpcpuhdb4096x128m4mw_170a U0_tsdn28hpcpuhdb4096x128m4mw_170a (
.CLK ( PortClk )
,.CEBA ( U_CEBA[k] )
,.WEBA ( PortAWriteEnable )
,.BWEBA ( BWEBA[127:0] )
,.AA ( PortAAddr[ADDRWIDTH-2:LSB] )
,.DA ( PortADataIn[127:0] )
,.QA ( U_QA[k][127:0] )
,.CEBB ( U_CEBB[k] )
,.WEBB ( PortBWriteEnable )
,.BWEBB ( BWEBB[127:0] )
,.AB ( PortBAddr[ADDRWIDTH-2:LSB] )
,.DB ( PortBDataIn[127:0] )
,.QB ( U_QB[k][127:0] )
,.RTSEL ( 2'b00 )
,.WTSEL ( 2'b00 )
,.PTSEL ( 2'b00 )
);
tsdn28hpcpuhdb4096x128m4mw_170a U1_tsdn28hpcpuhdb4096x128m4mw_170a (
.CLK ( PortClk )
,.CEBA ( U_CEBA[k] )
,.WEBA ( PortAWriteEnable )
,.BWEBA ( BWEBA[255:128] )
,.AA ( PortAAddr[ADDRWIDTH-2:LSB] )
,.DA ( PortADataIn[255:128] )
,.QA ( U_QA[k][255:128] )
,.CEBB ( U_CEBB[k] )
,.WEBB ( PortBWriteEnable )
,.BWEBB ( BWEBB[255:128] )
,.AB ( PortBAddr[ADDRWIDTH-2:LSB] )
,.DB ( PortBDataIn[255:128] )
,.QB ( U_QB[k][255:128] )
,.RTSEL ( 2'b00 )
,.WTSEL ( 2'b00 )
,.PTSEL ( 2'b00 )
);
tsdn28hpcpuhdb4096x128m4mw_170a U2_tsdn28hpcpuhdb4096x128m4mw_170a (
.CLK ( PortClk )
,.CEBA ( U_CEBA[k] )
,.WEBA ( PortAWriteEnable )
,.BWEBA ( BWEBA[383:256] )
,.AA ( PortAAddr[ADDRWIDTH-2:LSB] )
,.DA ( PortADataIn[383:256] )
,.QA ( U_QA[k][383:256] )
,.CEBB ( U_CEBB[k] )
,.WEBB ( PortBWriteEnable )
,.BWEBB ( BWEBB[383:256] )
,.AB ( PortBAddr[ADDRWIDTH-2:LSB] )
,.DB ( PortBDataIn[383:256] )
,.QB ( U_QB[k][383:256] )
,.RTSEL ( 2'b00 )
,.WTSEL ( 2'b00 )
,.PTSEL ( 2'b00 )
);
tsdn28hpcpuhdb4096x128m4mw_170a U3_tsdn28hpcpuhdb4096x128m4mw_170a (
.CLK ( PortClk )
,.CEBA ( U_CEBA[k] )
,.WEBA ( PortAWriteEnable )
,.BWEBA ( BWEBA[511:384] )
,.AA ( PortAAddr[ADDRWIDTH-2:LSB] )
,.DA ( PortADataIn[511:384] )
,.QA ( U_QA[k][511:384] )
,.CEBB ( U_CEBB[k] )
,.WEBB ( PortBWriteEnable )
,.BWEBB ( BWEBB[511:384] )
,.AB ( PortBAddr[ADDRWIDTH-2:LSB] )
,.DB ( PortBDataIn[511:384] )
,.QB ( U_QB[k][511:384] )
,.RTSEL ( 2'b00 )
,.WTSEL ( 2'b00 )
,.PTSEL ( 2'b00 )
);
end
always @(posedge PortClk) begin
if(PortAWriteEnable == 1'b1) begin
AA_1D_MSB <= PortAAddr[ADDRWIDTH-1];
end
else begin
AA_1D_MSB <= AA_1D_MSB;
end
end
always @(posedge PortClk) begin
if(PortBWriteEnable == 1'b1) begin
AB_1D_MSB <= PortBAddr[ADDRWIDTH-1];
end
else begin
AB_1D_MSB <= AB_1D_MSB;
end
end
assign PortADataOut = {DATAWIDTH{AA_1D_MSB == 1'h0}} & U_QA[0]
| {DATAWIDTH{AA_1D_MSB == 1'h1}} & U_QA[1]
;
assign PortBDataOut = {DATAWIDTH{AB_1D_MSB == 1'h0}} & U_QB[0]
| {DATAWIDTH{AB_1D_MSB == 1'h1}} & U_QB[1]
;
end
else begin:dpram_model_generation
dpram_model #(
.DATAWIDTH ( DATAWIDTH )
,.ADDRWIDTH ( ADDRWIDTH-LSB )
) U_dpram_model (
.PortClk ( PortClk )
,.PortAWriteEnable ( PortAWriteEnable )
,.PortAChipEnable ( PortAChipEnable )
,.PortAByteWriteEnable ( PortAByteWriteEnable )
,.PortAAddr ( PortAAddr[ADDRWIDTH-1:LSB] )
,.PortADataIn ( PortADataIn )
,.PortADataOut ( PortADataOut )
,.PortBWriteEnable ( PortBWriteEnable )
,.PortBChipEnable ( PortBChipEnable )
,.PortBByteWriteEnable ( PortBByteWriteEnable )
,.PortBAddr ( PortBAddr[ADDRWIDTH-1:LSB] )
,.PortBDataIn ( PortBDataIn )
,.PortBDataOut ( PortBDataOut )
);
end
endgenerate
endmodule