Change to simpler rom
This commit is contained in:
4096
hw/efinix_fpga/init_hex.mem
Normal file
4096
hw/efinix_fpga/init_hex.mem
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,111 +0,0 @@
|
||||
localparam FAMILY = 0; //0:Trion, 1:Titanium
|
||||
localparam ADDR_WIDTH_A = 8;
|
||||
localparam DATA_WIDTH_A = 8;
|
||||
localparam ADDR_WIDTH_B = 8;
|
||||
localparam DATA_WIDTH_B = 8;
|
||||
localparam TOTAL_SIZE_A = 256;
|
||||
localparam TOTAL_SIZE_B = 256;
|
||||
localparam BYTEEN_WIDTH = 1;
|
||||
localparam BYTEEN_WIDTH_A = 1;
|
||||
localparam BYTEEN_WIDTH_B = 1;
|
||||
localparam GROUP_DATA_WIDTH = 8;
|
||||
localparam GROUP_DATA_WIDTH_A = 0;
|
||||
localparam GROUP_DATA_WIDTH_B = 0;
|
||||
localparam GROUP_COLUMNS = 1;
|
||||
localparam bram_table_size = 1;
|
||||
localparam bram_table_loop_mode = 1;
|
||||
localparam bram_mapping_size = 1;
|
||||
localparam rMux_mapping_A_size = 0;
|
||||
localparam rMux_mapping_B_size = 0;
|
||||
localparam wen_sel_mapping_A_size = 0;
|
||||
localparam wen_sel_mapping_B_size = 0;
|
||||
localparam data_mapping_table_A_size = 0;
|
||||
localparam data_mapping_table_B_size = 0;
|
||||
localparam address_mapping_table_A_size = 0;
|
||||
localparam address_mapping_table_B_size = 0;
|
||||
|
||||
|
||||
function integer bram_feature_table;
|
||||
input integer index;//Mode type
|
||||
input integer val_; //Address_width, data_width, en_width, reserved
|
||||
case (index)
|
||||
0: bram_feature_table=(val_==0)?8:(val_==1)?20:(val_==2)?2:(val_==3)?0:(val_==4)?0:0;
|
||||
1: bram_feature_table=(val_==0)?9:(val_==1)?10:(val_==2)?1:(val_==3)?0:(val_==4)?0:0;
|
||||
2: bram_feature_table=(val_==0)?10:(val_==1)?5:(val_==2)?1:(val_==3)?0:(val_==4)?0:0;
|
||||
3: bram_feature_table=(val_==0)?8:(val_==1)?16:(val_==2)?2:(val_==3)?0:(val_==4)?1:0;
|
||||
4: bram_feature_table=(val_==0)?9:(val_==1)?8:(val_==2)?1:(val_==3)?0:(val_==4)?1:0;
|
||||
5: bram_feature_table=(val_==0)?10:(val_==1)?4:(val_==2)?1:(val_==3)?0:(val_==4)?1:0;
|
||||
6: bram_feature_table=(val_==0)?11:(val_==1)?2:(val_==2)?1:(val_==3)?0:(val_==4)?1:0;
|
||||
7: bram_feature_table=(val_==0)?12:(val_==1)?1:(val_==2)?1:(val_==3)?0:(val_==4)?1:0;
|
||||
endcase
|
||||
endfunction
|
||||
|
||||
|
||||
function integer bram_decompose_table;
|
||||
input integer index;//Mode type
|
||||
input integer val_; //Port A index, Port B Index, Number of Items in Loop, Port A Start, Port B Start, reserved
|
||||
case (index)
|
||||
0: bram_decompose_table=(val_==0)? 0:(val_==1)? 0:(val_==2)? 1:(val_==3)? 0:(val_==4)? 0:0;
|
||||
endcase
|
||||
endfunction
|
||||
|
||||
|
||||
function integer bram_mapping_table;
|
||||
input integer index;//Mode type
|
||||
input integer val_;// Y, X, DataA [MSB], DataA [LSB], DataA Repeat, Read MuxA, Wen0 SelA, Wen1 SelA, Byteen A, DataB [MSB], DataB [LSB], DataB Repeat, Read MuxB, Wen0 SelB, Wen1 SelB, Byteen B, Addr Width A Data Width A Addr Width B Data Width B
|
||||
case (index)
|
||||
0: bram_mapping_table=(val_== 0)? 0:(val_== 1)? 0:(val_== 2)? 7:(val_== 3)? 0:(val_== 4)? 0:(val_== 5)? 0:(val_== 6)? 0:(val_== 7)? 0:(val_== 8)? 0:(val_== 9)? 7:(val_==10)? 0:(val_==11)? 0:(val_==12)? 0:(val_==13)? 0:(val_==14)? 0:(val_==15)? 0:(val_==16)? 8:(val_==17)? 20:(val_==18)? 8:(val_==19)? 20:0;
|
||||
endcase
|
||||
endfunction
|
||||
|
||||
|
||||
function integer rMux_mapping_table_A;
|
||||
input integer index;//Mode type
|
||||
input integer val_;// PortA Addr MSB, PortA Addr LSB, DataA[MSB], DataA[LSB], MuxSelA[MSB], MuxSelA[LSB], Bypass,
|
||||
rMux_mapping_table_A = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer rMux_mapping_table_B;
|
||||
input integer index;//Mode type
|
||||
input integer val_;// PortB Addr MSB, PortB Addr LSB, DataB[MSB], DataB[LSB], MuxSelB[MSB], MuxSelB[LSB], Bypass,
|
||||
rMux_mapping_table_B = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer wen_sel_mapping_table_A;
|
||||
input integer index;//Mode type
|
||||
input integer val_;// PortA Addr MSB, PortA Addr LSB, WenSelA[MSB], WenSelA[LSB], Bypass,
|
||||
wen_sel_mapping_table_A = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer wen_sel_mapping_table_B;
|
||||
input integer index;//Mode type
|
||||
input integer val_;// PortB Addr MSB, PortB Addr LSB, WenSelB[MSB], WenSelB[LSB], Bypass,
|
||||
wen_sel_mapping_table_B = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer data_mapping_table_A;
|
||||
input integer index;//
|
||||
data_mapping_table_A = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer data_mapping_table_B;
|
||||
input integer index;//
|
||||
data_mapping_table_B = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer address_mapping_table_A;
|
||||
input integer index;//
|
||||
address_mapping_table_A = 0;
|
||||
endfunction
|
||||
|
||||
|
||||
function integer address_mapping_table_B;
|
||||
input integer index;//
|
||||
address_mapping_table_B = 0;
|
||||
endfunction
|
||||
@@ -1,49 +0,0 @@
|
||||
|
||||
function [255:0] bram_ini_table;
|
||||
input integer index;//Mode type
|
||||
input integer val_; //Port A index, Port B Index, Number of Items in Loop, Port A Start, Port B Start, reserved
|
||||
case (index)
|
||||
0: bram_ini_table=
|
||||
(val_== 0)?256'h00d00003a00018000a9000ea000ff000300002000000000a9000ff0002700020:
|
||||
(val_== 1)?256'h0a9000ff000300002000008000a900011000e60001000085000aa000a9000fd0:
|
||||
(val_== 2)?256'hfd00080000cb000ea000f000010000a5000ff000800002000000000a20001000:
|
||||
(val_== 3)?256'hd00010000a500048000600001300064000120006400011000640001000064000:
|
||||
(val_== 4)?256'h000ef000da0008d00012000a5000ef000d90008d00011000a5000ef000d80008:
|
||||
(val_== 5)?256'h0008000850005a00060000ef000dc0008d00068000ef000db0008d00013000a5:
|
||||
(val_== 6)?256'h091000c80000800091000c8000080009100000000a000000000a900009000860:
|
||||
(val_== 7)?256'hd8000ad000f9000f00000100029000ef000dc000ad0000800091000c80000800:
|
||||
(val_== 8)?256'ha000ad0000800091000c8000ef000d9000ad000080009100000000a0000ef000:
|
||||
(val_== 9)?256'h000600007a0000800091000c8000ef000db000ad0000800091000c8000ef000d:
|
||||
(val_==10)?256'h0091000c8000080009100000000a000000000a9000090008600008000850005a:
|
||||
(val_==11)?256'h0ad00026000f00008800012000a00000800091000c80000800091000c8000080:
|
||||
(val_==12)?256'h080009100000000a0000ef000d8000ad000f6000f00000100029000ef000dc00:
|
||||
(val_==13)?256'hd0000800091000c8000ef000da000ad0000800091000c8000ef000d9000ad000:
|
||||
(val_==14)?256'h0007a0006000000000a200000000a90007a0000800091000c8000ef000db000a:
|
||||
(val_==15)?256'h00000000000000000000000000000000000000000060000ff000a2000ff000a9:
|
||||
(val_==16)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==17)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==18)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==19)?256'h000ff00000000ff00000000ff000000000000000000000000000000000000000:
|
||||
(val_==20)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==21)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==22)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==23)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==24)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==25)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==26)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==27)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==28)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==29)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==30)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==31)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==32)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==33)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==34)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==35)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==36)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==37)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==38)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
(val_==39)?256'h0000000000000000000000000000000000000000000000000000000000000000:
|
||||
0;
|
||||
endcase
|
||||
endfunction
|
||||
@@ -1,281 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// _____
|
||||
// / _______ Copyright (C) 2013-2022 Efinix Inc. All rights reserved.
|
||||
// / / \
|
||||
// / / .. / bram_primitive.v
|
||||
// / / .' /
|
||||
// __/ /.' / Description:
|
||||
// __ \ /
|
||||
// /_/ /\ \_____/ /
|
||||
// ____/ \_______/
|
||||
//
|
||||
// *******************************
|
||||
// Revisions:
|
||||
// 0.0 Initial rev
|
||||
//
|
||||
// *******************************
|
||||
|
||||
module bram_primitive #(
|
||||
parameter FAMILY = 0, //0:Trion, 1:Titanium
|
||||
|
||||
//Trion and Titanium parameters
|
||||
parameter WRITE_WIDTH = 16, // write width
|
||||
parameter WCLK_POLARITY = 1'b1, //wclk polarity, 0:falling edge, 1:rising edge
|
||||
parameter WCLKE_POLARITY = 1'b1, //wclke polarity, 0:active low, 1:active high
|
||||
parameter WE_POLARITY = 1'b1, //we polarity, 0:active low, 1:active high
|
||||
parameter WRITE_MODE = "READ_FIRST",//write mode, "READ_FIRST" :Old memory content is read. (default)
|
||||
// "WRITE_FIRST" :Write data is passed to the read port.
|
||||
// "READ_UNKNOWN": Read and writes are unsynchronized, therefore, the results of the address can conflict.
|
||||
parameter READ_WIDTH = 16, // read width
|
||||
parameter RCLK_POLARITY = 1'b1, // rclk polarity, 0:falling edge, 1:rising edge
|
||||
parameter RE_POLARITY = 1'b1, // re polarity, 0:active low , 1:active high
|
||||
parameter OUTPUT_REG = 1'b0, // Output register enable, 1:add pipe-line read register
|
||||
|
||||
//Titanium extra paramters
|
||||
parameter RST_POLARITY = 1'b1, // rst polarity
|
||||
parameter RESET_RAM = "ASYNC", // reset mode on ram, "NONE": RST signals does not affect the RAM output.
|
||||
// "ASYNC": RAM output resets asynchronously to RCLK.
|
||||
// "SYNC": RAM output resets synchronously to RCLK.
|
||||
parameter RESET_OUTREG = "ASYNC", // reset mode on output register
|
||||
// "NONE": RST signals does not affect the RAM output register
|
||||
// "ASYNC": RAM output register resets asynchronously to RCLK.
|
||||
parameter WADDREN_POLARITY = 1'b1, // waddren polarity
|
||||
parameter RADDREN_POLARITY = 1'b1, // raddren polarity
|
||||
|
||||
//Titanium Option for byte enable in WEN width = 2 when it is Mode 512x16 or 512x20
|
||||
parameter WEN_WIDTH = 1,
|
||||
|
||||
parameter ini_index = 0
|
||||
|
||||
)
|
||||
(
|
||||
//Trion and Titanium ports
|
||||
WCLK, // Write clock input
|
||||
WCLKE, // Write clock-enable input
|
||||
WE, // Write-enable input
|
||||
WADDR, // Write address input
|
||||
WDATA, // Write data input
|
||||
|
||||
RCLK, // Read clock input
|
||||
RE, // Read-enable input
|
||||
RADDR, // Read address input
|
||||
RDATA, // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
RST, // reset
|
||||
WADDREN, // write address enable
|
||||
RADDREN // read address enable
|
||||
|
||||
);
|
||||
function integer address_map;
|
||||
input integer index;//Input data width parameter
|
||||
input integer type; //Mapped data width, Mapped Address Width for Ram 5K(Trion), Mapped Address Width for Ram 10K(Titanium), WEN width for Ram 5K(Trion), WEN width for Ram 10K(Titanium)
|
||||
case (index)
|
||||
0 : address_map= (type==0)? 1 :(type==1)? 12 :(type==2)? 13 :1;
|
||||
1 : address_map= (type==0)? 1 :(type==1)? 12 :(type==2)? 13 :1;
|
||||
2 : address_map= (type==0)? 2 :(type==1)? 11 :(type==2)? 12 :1;
|
||||
3 : address_map= (type==0)? 4 :(type==1)? 10 :(type==2)? 11 :1;
|
||||
4 : address_map= (type==0)? 4 :(type==1)? 10 :(type==2)? 11 :1;
|
||||
5 : address_map= (type==0)? 5 :(type==1)? 10 :(type==2)? 11 :1;
|
||||
6 : address_map= (type==0)? 8 :(type==1)? 9 :(type==2)? 10 :1;
|
||||
7 : address_map= (type==0)? 8 :(type==1)? 9 :(type==2)? 10 :1;
|
||||
8 : address_map= (type==0)? 8 :(type==1)? 9 :(type==2)? 10 :1;
|
||||
9 : address_map= (type==0)? 10 :(type==1)? 9 :(type==2)? 10 :1;
|
||||
10 : address_map= (type==0)? 10 :(type==1)? 9 :(type==2)? 10 :1;
|
||||
11 : address_map= (type==0)? 16 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
12 : address_map= (type==0)? 16 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
13 : address_map= (type==0)? 16 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
14 : address_map= (type==0)? 16 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
15 : address_map= (type==0)? 16 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
16 : address_map= (type==0)? 16 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
17 : address_map= (type==0)? 20 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
18 : address_map= (type==0)? 20 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
19 : address_map= (type==0)? 20 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
20 : address_map= (type==0)? 20 :(type==1)? 8 :(type==2)? 9 :1;
|
||||
endcase
|
||||
endfunction
|
||||
|
||||
localparam WRITE_DATA_WIDTH = address_map(WRITE_WIDTH,0);
|
||||
localparam WRITE_ADDRESS_WIDTH = address_map(WRITE_WIDTH,(FAMILY==0)?1:2);
|
||||
|
||||
localparam READ_DATA_WIDTH = address_map(READ_WIDTH,0);
|
||||
localparam READ_ADDRESS_WIDTH = address_map(READ_WIDTH,(FAMILY==0)?1:2);
|
||||
|
||||
|
||||
//Trion and Titanium ports
|
||||
input WCLK; // Write clock input
|
||||
input WCLKE; // Write clock-enable input
|
||||
input [WEN_WIDTH-1:0] WE; // Write-enable input
|
||||
input [WRITE_ADDRESS_WIDTH-1:0] WADDR; // Write address input
|
||||
input [WRITE_DATA_WIDTH-1:0] WDATA; // Write data input
|
||||
|
||||
input RCLK; // Read clock input
|
||||
input RE; // Read-enable input
|
||||
input [READ_ADDRESS_WIDTH-1:0] RADDR; // Read address input
|
||||
output[READ_DATA_WIDTH-1:0]RDATA; // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
input RST; // reset
|
||||
input WADDREN; // write address enable
|
||||
input RADDREN; // read address enable
|
||||
|
||||
|
||||
`include "bram_ini.vh"
|
||||
parameter filePath = "bram_ini.vh";
|
||||
integer fd;
|
||||
|
||||
generate
|
||||
initial begin
|
||||
fd = $fopen(filePath, "r");
|
||||
$fclose(fd);
|
||||
end
|
||||
|
||||
|
||||
if (FAMILY==0)
|
||||
begin
|
||||
EFX_RAM_5K # (
|
||||
.WRITE_WIDTH (WRITE_WIDTH),
|
||||
.WCLK_POLARITY (WCLK_POLARITY),
|
||||
.WCLKE_POLARITY (WCLKE_POLARITY),
|
||||
.WE_POLARITY (WE_POLARITY),
|
||||
.WRITE_MODE (WRITE_MODE),
|
||||
|
||||
.READ_WIDTH (READ_WIDTH),
|
||||
.RCLK_POLARITY (RCLK_POLARITY),
|
||||
.RE_POLARITY (RE_POLARITY),
|
||||
.OUTPUT_REG (OUTPUT_REG),
|
||||
|
||||
|
||||
.INIT_0 (bram_ini_table(ini_index,16'h0 )),
|
||||
.INIT_1 (bram_ini_table(ini_index,16'h1 )),
|
||||
.INIT_2 (bram_ini_table(ini_index,16'h2 )),
|
||||
.INIT_3 (bram_ini_table(ini_index,16'h3 )),
|
||||
.INIT_4 (bram_ini_table(ini_index,16'h4 )),
|
||||
.INIT_5 (bram_ini_table(ini_index,16'h5 )),
|
||||
.INIT_6 (bram_ini_table(ini_index,16'h6 )),
|
||||
.INIT_7 (bram_ini_table(ini_index,16'h7 )),
|
||||
.INIT_8 (bram_ini_table(ini_index,16'h8 )),
|
||||
.INIT_9 (bram_ini_table(ini_index,16'h9 )),
|
||||
.INIT_A (bram_ini_table(ini_index,16'hA )),
|
||||
.INIT_B (bram_ini_table(ini_index,16'hB )),
|
||||
.INIT_C (bram_ini_table(ini_index,16'hC )),
|
||||
.INIT_D (bram_ini_table(ini_index,16'hD )),
|
||||
.INIT_E (bram_ini_table(ini_index,16'hE )),
|
||||
.INIT_F (bram_ini_table(ini_index,16'hF )),
|
||||
.INIT_10 (bram_ini_table(ini_index,16'h10)),
|
||||
.INIT_11 (bram_ini_table(ini_index,16'h11)),
|
||||
.INIT_12 (bram_ini_table(ini_index,16'h12)),
|
||||
.INIT_13 (bram_ini_table(ini_index,16'h13))
|
||||
)
|
||||
ram5k (
|
||||
.WCLK(WCLK), // Write clock input
|
||||
.WE(WE[0]), // Write-enable input
|
||||
.WCLKE(WCLKE), // Write clock-enable input
|
||||
.WADDR(WADDR), // Write address input
|
||||
.WDATA(WDATA), // Write data input
|
||||
|
||||
.RCLK(RCLK), // Read clock input
|
||||
.RE(RE), // Read-enable input
|
||||
.RADDR(RADDR), // Read address input
|
||||
.RDATA(RDATA) // Read data output
|
||||
);
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
||||
wire [1:0]w_wen_ram10;
|
||||
assign w_wen_ram10[0] = WE[0];
|
||||
|
||||
if (WEN_WIDTH>1)
|
||||
assign w_wen_ram10[1] = WE[1];
|
||||
else if (WRITE_DATA_WIDTH >= 16 )
|
||||
assign w_wen_ram10[1] = WE[0];
|
||||
else
|
||||
assign w_wen_ram10[1] = 1'b0;
|
||||
|
||||
EFX_RAM10 # (
|
||||
|
||||
.WRITE_WIDTH (WRITE_WIDTH),
|
||||
.WCLK_POLARITY (WCLK_POLARITY),
|
||||
.WCLKE_POLARITY (WCLKE_POLARITY),
|
||||
.WE_POLARITY (WE_POLARITY),
|
||||
.WRITE_MODE (WRITE_MODE),
|
||||
|
||||
.READ_WIDTH (READ_WIDTH),
|
||||
.RCLK_POLARITY (RCLK_POLARITY),
|
||||
.RE_POLARITY (RE_POLARITY),
|
||||
.OUTPUT_REG (OUTPUT_REG),
|
||||
|
||||
//Titanium extra paramters
|
||||
.RST_POLARITY (RST_POLARITY), // rst polarity
|
||||
.RESET_RAM (RESET_RAM), // reset mode on ram
|
||||
.RESET_OUTREG (RESET_OUTREG), // reset mode on output register
|
||||
.WADDREN_POLARITY (WADDREN_POLARITY), // waddren polarity
|
||||
.RADDREN_POLARITY (RADDREN_POLARITY), // raddren polarity
|
||||
|
||||
|
||||
.INIT_0 (bram_ini_table(ini_index, 16'h0 )),
|
||||
.INIT_1 (bram_ini_table(ini_index, 16'h1 )),
|
||||
.INIT_2 (bram_ini_table(ini_index, 16'h2 )),
|
||||
.INIT_3 (bram_ini_table(ini_index, 16'h3 )),
|
||||
.INIT_4 (bram_ini_table(ini_index, 16'h4 )),
|
||||
.INIT_5 (bram_ini_table(ini_index, 16'h5 )),
|
||||
.INIT_6 (bram_ini_table(ini_index, 16'h6 )),
|
||||
.INIT_7 (bram_ini_table(ini_index, 16'h7 )),
|
||||
.INIT_8 (bram_ini_table(ini_index, 16'h8 )),
|
||||
.INIT_9 (bram_ini_table(ini_index, 16'h9 )),
|
||||
.INIT_A (bram_ini_table(ini_index, 16'hA )),
|
||||
.INIT_B (bram_ini_table(ini_index, 16'hB )),
|
||||
.INIT_C (bram_ini_table(ini_index, 16'hC )),
|
||||
.INIT_D (bram_ini_table(ini_index, 16'hD )),
|
||||
.INIT_E (bram_ini_table(ini_index, 16'hE )),
|
||||
.INIT_F (bram_ini_table(ini_index, 16'hF )),
|
||||
.INIT_10 (bram_ini_table(ini_index, 16'h10)),
|
||||
.INIT_11 (bram_ini_table(ini_index, 16'h11)),
|
||||
.INIT_12 (bram_ini_table(ini_index, 16'h12)),
|
||||
.INIT_13 (bram_ini_table(ini_index, 16'h13)),
|
||||
.INIT_14 (bram_ini_table(ini_index, 16'h14)),
|
||||
.INIT_15 (bram_ini_table(ini_index, 16'h15)),
|
||||
.INIT_16 (bram_ini_table(ini_index, 16'h16)),
|
||||
.INIT_17 (bram_ini_table(ini_index, 16'h17)),
|
||||
.INIT_18 (bram_ini_table(ini_index, 16'h18)),
|
||||
.INIT_19 (bram_ini_table(ini_index, 16'h19)),
|
||||
.INIT_1A (bram_ini_table(ini_index, 16'h1A)),
|
||||
.INIT_1B (bram_ini_table(ini_index, 16'h1B)),
|
||||
.INIT_1C (bram_ini_table(ini_index, 16'h1C)),
|
||||
.INIT_1D (bram_ini_table(ini_index, 16'h1D)),
|
||||
.INIT_1E (bram_ini_table(ini_index, 16'h1E)),
|
||||
.INIT_1F (bram_ini_table(ini_index, 16'h1F)),
|
||||
.INIT_20 (bram_ini_table(ini_index, 16'h20)),
|
||||
.INIT_21 (bram_ini_table(ini_index, 16'h21)),
|
||||
.INIT_22 (bram_ini_table(ini_index, 16'h22)),
|
||||
.INIT_23 (bram_ini_table(ini_index, 16'h23)),
|
||||
.INIT_24 (bram_ini_table(ini_index, 16'h24)),
|
||||
.INIT_25 (bram_ini_table(ini_index, 16'h25)),
|
||||
.INIT_26 (bram_ini_table(ini_index, 16'h26)),
|
||||
.INIT_27 (bram_ini_table(ini_index, 16'h27))
|
||||
|
||||
)
|
||||
ram10k(
|
||||
|
||||
.WCLK(WCLK), // Write clock input
|
||||
.WE(w_wen_ram10), // Write-enable input
|
||||
.WCLKE(WCLKE), // Write clock-enable input
|
||||
.WADDR(WADDR), // Write address input
|
||||
.WDATA(WDATA), // Write data input
|
||||
|
||||
.RCLK(RCLK), // Read clock input
|
||||
.RE(RE), // Read-enable input
|
||||
.RADDR(RADDR), // Read address input
|
||||
.RDATA(RDATA), // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
.RST (RST), // reset
|
||||
.WADDREN (WADDREN), // write address enable
|
||||
.RADDREN (RADDREN) // read address enable
|
||||
|
||||
);
|
||||
end
|
||||
endgenerate
|
||||
|
||||
endmodule
|
||||
@@ -1,635 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// _____
|
||||
// / _______ Copyright (C) 2013-2022 Efinix Inc. All rights reserved.
|
||||
// / / \
|
||||
// / / .. / tb_top.v
|
||||
// / / .' /
|
||||
// __/ /.' / Description:
|
||||
// __ \ /
|
||||
// /_/ /\ \_____/ /
|
||||
// ____/ \_______/
|
||||
//
|
||||
// *******************************
|
||||
// Revisions:
|
||||
// 0.0 Initial rev
|
||||
//
|
||||
// *******************************
|
||||
|
||||
module bram_wrapper_mwm #(
|
||||
//parameter FAMILY = 0, //0:Trion, 1:Titanium
|
||||
|
||||
//Trion and Titanium parameters
|
||||
parameter WCLK_POLARITY = 1'b1, //wclk polarity, 0:falling edge, 1:rising edge
|
||||
parameter WCLKE_POLARITY = 1'b1, //wclke polarity, 0:active low, 1:active high
|
||||
parameter WE_POLARITY = 1'b1, //we polarity, 0:active low, 1:active high
|
||||
parameter WRITE_MODE = "READ_FIRST",//write mode, "READ_FIRST" :Old memory content is read. (default)
|
||||
// "WRITE_FIRST" :Write data is passed to the read port.
|
||||
// "READ_UNKNOWN": Read and writes are unsynchronized, therefore, the results of the address can conflict.
|
||||
parameter RCLK_POLARITY = 1'b1, // rclk polarity, 0:falling edge, 1:rising edge
|
||||
parameter RE_POLARITY = 1'b1, // re polarity, 0:active low , 1:active high
|
||||
parameter OUTPUT_REG = 1'b0, // Output register enable, 1:add pipe-line read register
|
||||
|
||||
parameter BYTEEN_POLARITY = 1'b1, // byteen polarity 0:active low, 1:active high
|
||||
|
||||
//Titanium extra paramters
|
||||
parameter RST_POLARITY = 1'b1, // rst polarity
|
||||
parameter RESET_RAM = "ASYNC", // reset mode on ram, "NONE": RST signals does not affect the RAM output.
|
||||
// "ASYNC": RAM output resets asynchronously to RCLK.
|
||||
// "SYNC": RAM output resets synchronously to RCLK.
|
||||
parameter RESET_OUTREG = "ASYNC", // reset mode on output register
|
||||
// "NONE": RST signals does not affect the RAM output register
|
||||
// "ASYNC": RAM output register resets asynchronously to RCLK.
|
||||
parameter WADDREN_POLARITY = 1'b1, // waddren polarity
|
||||
parameter RADDREN_POLARITY = 1'b1 // raddren polarity
|
||||
|
||||
|
||||
|
||||
)
|
||||
(
|
||||
//Trion and Titanium ports
|
||||
wclk, // Write clock input
|
||||
wclke, // Write clock-enable input
|
||||
byteen, // Byteen input
|
||||
we, // Write-enable input
|
||||
waddr, // Write address input
|
||||
wdata, // Write data input
|
||||
|
||||
rclk, // Read clock input
|
||||
re, // Read-enable input
|
||||
raddr, // Read address input
|
||||
rdata, // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
reset, // reset
|
||||
waddren, // write address enable
|
||||
raddren // read address enable
|
||||
|
||||
);
|
||||
|
||||
|
||||
`include "bram_decompose.vh"
|
||||
//`include "bram_feature.vh"
|
||||
|
||||
input wclk;
|
||||
input wclke;
|
||||
input we;
|
||||
input [BYTEEN_WIDTH-1:0] byteen;
|
||||
input [ADDR_WIDTH_A-1:0 ] waddr;
|
||||
input [DATA_WIDTH_A-1:0 ] wdata;
|
||||
|
||||
input rclk;
|
||||
input re;
|
||||
input [ADDR_WIDTH_B-1:0 ] raddr;
|
||||
output [DATA_WIDTH_B-1:0 ]rdata;
|
||||
|
||||
input reset;
|
||||
input waddren;
|
||||
input raddren;
|
||||
|
||||
wire [ADDR_WIDTH_A-1:0 ] w_waddr_map;
|
||||
wire [DATA_WIDTH_A-1:0 ] w_wdata_map;
|
||||
|
||||
wire [ADDR_WIDTH_B-1:0 ] w_raddr_map;
|
||||
wire [DATA_WIDTH_B-1:0 ] w_rdata_map;
|
||||
|
||||
|
||||
function integer get_current_row_index;
|
||||
input integer row;//Mode type
|
||||
integer x;
|
||||
begin
|
||||
get_current_row_index = 0;
|
||||
for (x=0; x<bram_mapping_size; x=x+1)
|
||||
begin
|
||||
if (bram_mapping_table(x,0) < row)
|
||||
get_current_row_index = get_current_row_index +1;
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
function integer get_current_column_index;
|
||||
input integer column;//Mode type
|
||||
integer x;
|
||||
begin
|
||||
get_current_column_index = 0;
|
||||
for (x=0; x<bram_mapping_size; x=x+1)
|
||||
begin
|
||||
if (bram_mapping_table(x,1) < column)
|
||||
get_current_column_index = get_current_column_index +1;
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
|
||||
function integer get_max_mux_row_A;
|
||||
input integer temp;//Mode type
|
||||
integer x;
|
||||
begin
|
||||
get_max_mux_row_A = 0;
|
||||
for (x=0; x<bram_mapping_size; x=x+1)
|
||||
begin
|
||||
if ( get_max_mux_row_A < bram_mapping_table(x,5) )
|
||||
get_max_mux_row_A = bram_mapping_table(x,5);
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
function integer get_max_wen_decode_A;
|
||||
input integer temp;//Mode type
|
||||
integer x;
|
||||
begin
|
||||
get_max_wen_decode_A = 0;
|
||||
for (x=0; x<bram_mapping_size; x=x+1)
|
||||
begin
|
||||
if ( get_max_wen_decode_A < bram_mapping_table(x,6) )
|
||||
get_max_wen_decode_A = bram_mapping_table(x,6);
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
|
||||
function integer get_max_mux_row_B;
|
||||
input integer temp;//Mode type
|
||||
integer x;
|
||||
begin
|
||||
get_max_mux_row_B = 0;
|
||||
for (x=0; x<bram_mapping_size; x=x+1)
|
||||
begin
|
||||
if ( get_max_mux_row_B < bram_mapping_table(x,12) )
|
||||
get_max_mux_row_B = bram_mapping_table(x,12);
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
function integer get_max_wen_decode_B;
|
||||
input integer temp;//Mode type
|
||||
integer x;
|
||||
begin
|
||||
get_max_wen_decode_B = 0;
|
||||
for (x=0; x<bram_mapping_size; x=x+1)
|
||||
begin
|
||||
if ( get_max_wen_decode_B < bram_mapping_table(x,13) )
|
||||
get_max_wen_decode_B = bram_mapping_table(x,13);
|
||||
end
|
||||
end
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
// localparam column_size = (bram_table_loop_mode==1)?bram_table_size:1;
|
||||
// wire [DATA_WIDTH_B-1:0] w_rdata [bram_table_size-1:0 ];
|
||||
// assign rdata = w_rdata[wdata];
|
||||
genvar gen_x;
|
||||
genvar gen_y;
|
||||
genvar gen_z;
|
||||
|
||||
generate
|
||||
|
||||
wire [DATA_WIDTH_B-1:0 ] rMux [get_max_mux_row_B(0):0];
|
||||
if (rMux_mapping_B_size == 0)
|
||||
begin
|
||||
assign w_rdata_map = rMux[0];
|
||||
end
|
||||
else
|
||||
begin
|
||||
for (gen_y=0; gen_y<rMux_mapping_B_size; gen_y =gen_y +1)
|
||||
begin:rDataMux
|
||||
localparam ADDR_START = rMux_mapping_table_B(gen_y,1);
|
||||
localparam ADDR_END = rMux_mapping_table_B(gen_y,0);
|
||||
|
||||
localparam DATA_START = rMux_mapping_table_B(gen_y,3);
|
||||
localparam DATA_END = rMux_mapping_table_B(gen_y,2);
|
||||
localparam BYPRASSED = rMux_mapping_table_A(gen_y,6);
|
||||
|
||||
if( BYPRASSED == 0 )
|
||||
begin
|
||||
|
||||
wire [ADDR_END:ADDR_START] rdSel;
|
||||
reg [ADDR_END:ADDR_START] r_rdSel_1P;
|
||||
|
||||
assign rdSel = w_raddr_map[ADDR_END:ADDR_START];
|
||||
|
||||
always @ (posedge rclk)
|
||||
begin
|
||||
r_rdSel_1P <= rdSel;
|
||||
end
|
||||
|
||||
|
||||
if (OUTPUT_REG == 0)
|
||||
begin
|
||||
assign w_rdata_map[DATA_END:DATA_START] = rMux[r_rdSel_1P][DATA_END:DATA_START];
|
||||
end
|
||||
else
|
||||
begin
|
||||
reg [ADDR_END:ADDR_START] r_rdSel_2P;
|
||||
always @ (posedge rclk)
|
||||
begin
|
||||
r_rdSel_2P <= r_rdSel_1P;
|
||||
end
|
||||
assign w_rdata_map[DATA_END:DATA_START] = rMux[r_rdSel_2P][DATA_END:DATA_START];
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
assign w_rdata_map[DATA_END:DATA_START] = rMux[0][DATA_END:DATA_START];
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
wire [get_max_wen_decode_A(0):0] wen_decode ;
|
||||
if (wen_sel_mapping_A_size!=0)
|
||||
begin
|
||||
for (gen_y=0; gen_y<wen_sel_mapping_A_size; gen_y =gen_y +1)
|
||||
begin:wDataEn
|
||||
localparam ADDR_START = wen_sel_mapping_table_A(gen_y,1);
|
||||
localparam ADDR_END = wen_sel_mapping_table_A(gen_y,0);
|
||||
|
||||
localparam SEL_START = wen_sel_mapping_table_A(gen_y,3);
|
||||
localparam SEL_END = wen_sel_mapping_table_A(gen_y,2);
|
||||
|
||||
localparam BYPRASSED = wen_sel_mapping_table_A(gen_y,4);
|
||||
|
||||
if( BYPRASSED == 0 )
|
||||
begin
|
||||
wire [ADDR_END:ADDR_START] wrSel;
|
||||
assign wrSel = w_waddr_map[ADDR_END:ADDR_START];
|
||||
|
||||
for (gen_x=SEL_START; gen_x<(SEL_END+1); gen_x = gen_x +1)
|
||||
begin
|
||||
assign wen_decode[gen_x] = (wrSel==(gen_x-SEL_START))?1'b1:1'b0;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
||||
for (gen_x=SEL_START; gen_x<(SEL_END+1); gen_x = gen_x +1)
|
||||
begin
|
||||
assign wen_decode[gen_x] = 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
assign wen_decode = {(get_max_wen_decode_A(0)+1){1'b1}};
|
||||
end
|
||||
|
||||
|
||||
//For Mixed Width Mode
|
||||
if (data_mapping_table_A_size!=0)
|
||||
begin
|
||||
for (gen_y=0; gen_y<data_mapping_table_A_size; gen_y = gen_y +1)
|
||||
begin
|
||||
assign w_wdata_map[data_mapping_table_A(gen_y)] = wdata[gen_y] ;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
assign w_wdata_map = wdata;
|
||||
end
|
||||
|
||||
if (address_mapping_table_A_size!=0)
|
||||
begin
|
||||
for (gen_y=0; gen_y<address_mapping_table_A_size; gen_y = gen_y +1)
|
||||
begin
|
||||
assign w_waddr_map[address_mapping_table_A(gen_y)] = waddr[gen_y] ;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
assign w_waddr_map = waddr;
|
||||
end
|
||||
|
||||
|
||||
if (data_mapping_table_B_size!=0)
|
||||
begin
|
||||
for (gen_y=0; gen_y<data_mapping_table_B_size; gen_y = gen_y +1)
|
||||
begin
|
||||
assign rdata[gen_y] = w_rdata_map[data_mapping_table_B(gen_y)] ;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
assign rdata = w_rdata_map;
|
||||
end
|
||||
|
||||
if (address_mapping_table_B_size!=0)
|
||||
begin
|
||||
for (gen_y=0; gen_y<address_mapping_table_B_size; gen_y = gen_y +1)
|
||||
begin
|
||||
assign w_raddr_map[address_mapping_table_B(gen_y)] = raddr[gen_y] ;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
assign w_raddr_map = raddr;
|
||||
end
|
||||
|
||||
|
||||
if (bram_table_loop_mode == 0 )
|
||||
begin:scan_column
|
||||
for (gen_x=0; gen_x<bram_table_size; gen_x =gen_x +1)
|
||||
begin:column
|
||||
localparam bram_mode_a = bram_decompose_table(gen_x,0);
|
||||
localparam bram_mode_b = bram_decompose_table(gen_x,1);
|
||||
localparam row_count = bram_decompose_table(gen_x,2);
|
||||
|
||||
localparam WADDR_WIDTH_ROW = bram_feature_table(bram_mode_a,0);
|
||||
localparam WDATA_WIDTH_ROW = bram_feature_table(bram_mode_a,1);
|
||||
localparam WEN_WIDTH_ROW = bram_feature_table(bram_mode_a,2);
|
||||
|
||||
localparam RADDR_WIDTH_ROW = bram_feature_table(bram_mode_b,0);
|
||||
localparam RDATA_WIDTH_ROW = bram_feature_table(bram_mode_b,1);
|
||||
|
||||
localparam START_COLUMN_INDEX = get_current_column_index(gen_x);
|
||||
|
||||
|
||||
for (gen_y=0; gen_y<row_count; gen_y =gen_y +1)
|
||||
begin:row
|
||||
|
||||
localparam DATA_MAP_INDEX = START_COLUMN_INDEX+gen_y;
|
||||
|
||||
localparam WDATA_END = bram_mapping_table(DATA_MAP_INDEX,2);
|
||||
localparam WDATA_START = bram_mapping_table(DATA_MAP_INDEX,3);
|
||||
localparam WDATA_REPART = bram_mapping_table(DATA_MAP_INDEX,4);
|
||||
localparam WRSEL_INDEX = bram_mapping_table(DATA_MAP_INDEX,6);
|
||||
localparam BYTEEN_INDEX = bram_mapping_table(DATA_MAP_INDEX,8);
|
||||
|
||||
localparam RDATA_END = bram_mapping_table(DATA_MAP_INDEX,9);
|
||||
localparam RDATA_START = bram_mapping_table(DATA_MAP_INDEX,10);
|
||||
localparam RDATA_REPART = bram_mapping_table(DATA_MAP_INDEX,11);
|
||||
localparam RMUX_INDEX = bram_mapping_table(DATA_MAP_INDEX,12);
|
||||
|
||||
wire [WADDR_WIDTH_ROW-1:0] w_waddr;
|
||||
wire [WDATA_WIDTH_ROW-1:0] w_wdata;
|
||||
wire [WEN_WIDTH_ROW-1:0] w_we;
|
||||
|
||||
wire [RADDR_WIDTH_ROW-1:0] w_raddr;
|
||||
wire [RDATA_WIDTH_ROW-1:0] w_rdata;
|
||||
|
||||
assign w_waddr[WADDR_WIDTH_ROW-1:0] = w_waddr_map[WADDR_WIDTH_ROW-1:0];
|
||||
assign w_raddr[RADDR_WIDTH_ROW-1:0] = w_raddr_map[RADDR_WIDTH_ROW-1:0];
|
||||
|
||||
|
||||
if (WDATA_REPART == 0)
|
||||
begin
|
||||
assign w_wdata[WDATA_WIDTH_ROW-1:0] = w_wdata_map[WDATA_END:WDATA_START];
|
||||
end
|
||||
else
|
||||
begin
|
||||
//for Mixed Width Mode
|
||||
for (gen_z=0; gen_z<WDATA_REPART; gen_z = gen_z+1)
|
||||
begin
|
||||
localparam MIXED_WDATA_START = WDATA_START + gen_z*row_count*(RDATA_END - RDATA_START+1); //RDATA_WIDTH_ROW;
|
||||
localparam MIXED_WDATA_END = WDATA_END + gen_z*row_count*(RDATA_END - RDATA_START+1); //RDATA_WIDTH_ROW;
|
||||
|
||||
localparam MAPPED_WDATA_START = RDATA_WIDTH_ROW* gen_z;
|
||||
localparam MAPPED_WDATA_END = RDATA_WIDTH_ROW*(gen_z+1) -1;
|
||||
|
||||
|
||||
assign w_wdata[MAPPED_WDATA_END: MAPPED_WDATA_START] = w_wdata_map[MIXED_WDATA_END:MIXED_WDATA_START];
|
||||
end
|
||||
end
|
||||
|
||||
if (RDATA_REPART == 0)
|
||||
begin
|
||||
assign rMux[RMUX_INDEX][RDATA_END:RDATA_START] = w_rdata[RDATA_WIDTH_ROW-1:0];
|
||||
end
|
||||
else
|
||||
begin
|
||||
//for Mixed Width Mode
|
||||
for (gen_z=0; gen_z<RDATA_REPART; gen_z = gen_z+1)
|
||||
begin
|
||||
localparam MIXED_RDATA_START = RDATA_START + gen_z*row_count*(WDATA_END - WDATA_START+1); //WDATA_WIDTH_ROW;
|
||||
localparam MIXED_RDATA_END = RDATA_END + gen_z*row_count*(WDATA_END - WDATA_START+1); //WDATA_WIDTH_ROW;
|
||||
|
||||
localparam MAPPED_RDATA_START = RDATA_WIDTH_ROW* gen_z;
|
||||
localparam MAPPED_RDATA_END = RDATA_WIDTH_ROW*(gen_z+1) -1;
|
||||
|
||||
|
||||
assign rMux[RMUX_INDEX][MIXED_RDATA_END:MIXED_RDATA_START] = w_rdata[MAPPED_RDATA_END:MAPPED_RDATA_START];
|
||||
end
|
||||
end
|
||||
|
||||
assign w_we[0] = ((we == WE_POLARITY) & wen_decode[WRSEL_INDEX] & (byteen[BYTEEN_INDEX] == BYTEEN_POLARITY) )? WE_POLARITY: !WE_POLARITY;
|
||||
if ( WEN_WIDTH_ROW >1)
|
||||
begin
|
||||
assign w_we[1] = ((we == WE_POLARITY) & wen_decode[WRSEL_INDEX] & (byteen[BYTEEN_INDEX] == BYTEEN_POLARITY) ) ? WE_POLARITY: !WE_POLARITY;
|
||||
end
|
||||
|
||||
bram_primitive #(
|
||||
.FAMILY(FAMILY), //0:Trion, 1:Titanium
|
||||
|
||||
//Trion and Titanium parameters
|
||||
.WRITE_WIDTH(WDATA_WIDTH_ROW),
|
||||
.WCLK_POLARITY(WCLK_POLARITY),
|
||||
.WCLKE_POLARITY(WCLKE_POLARITY),
|
||||
.WE_POLARITY(WE_POLARITY),
|
||||
.WRITE_MODE(WRITE_MODE),
|
||||
|
||||
.READ_WIDTH(RDATA_WIDTH_ROW),
|
||||
.RCLK_POLARITY(RCLK_POLARITY),
|
||||
.RE_POLARITY(RE_POLARITY),
|
||||
.OUTPUT_REG(OUTPUT_REG),
|
||||
|
||||
//Titanium extra paramters
|
||||
.RST_POLARITY(RST_POLARITY),
|
||||
.RESET_RAM(RESET_RAM),
|
||||
.RESET_OUTREG(RESET_OUTREG),
|
||||
.WADDREN_POLARITY(WADDREN_POLARITY),
|
||||
.RADDREN_POLARITY(RADDREN_POLARITY),
|
||||
|
||||
.WEN_WIDTH(WEN_WIDTH_ROW),
|
||||
|
||||
.ini_index(DATA_MAP_INDEX)
|
||||
|
||||
) bram (
|
||||
//Trion and Titanium ports
|
||||
.WCLK(wclk), // Write clock input
|
||||
.WCLKE(wclke), // Write clock-enable input
|
||||
.WE(w_we), // Write-enable input
|
||||
.WADDR(w_waddr), // Write address input
|
||||
.WDATA(w_wdata), // Write data input
|
||||
|
||||
.RCLK(rclk), // Read clock input
|
||||
.RE(re), // Read-enable input
|
||||
.RADDR(w_raddr), // Read address input
|
||||
.RDATA(w_rdata), // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
.RST(reset), // reset
|
||||
.WADDREN(waddren), // write address enable
|
||||
.RADDREN(raddren) // read address enable
|
||||
);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
else if (bram_table_loop_mode == 1 )
|
||||
begin:scan_row
|
||||
for (gen_y=0; gen_y<bram_table_size; gen_y =gen_y +1)
|
||||
begin:row
|
||||
localparam bram_mode_a = bram_decompose_table(gen_y,0);
|
||||
localparam bram_mode_b = bram_decompose_table(gen_y,1);
|
||||
localparam column_count = bram_decompose_table(gen_y,2);
|
||||
|
||||
localparam WADDR_WIDTH_ROW = bram_feature_table(bram_mode_a,0);
|
||||
localparam WDATA_WIDTH_ROW = bram_feature_table(bram_mode_a,1);
|
||||
localparam WEN_WIDTH_ROW = bram_feature_table(bram_mode_a,2);
|
||||
|
||||
localparam RADDR_WIDTH_ROW = bram_feature_table(bram_mode_b,0);
|
||||
localparam RDATA_WIDTH_ROW = bram_feature_table(bram_mode_b,1);
|
||||
|
||||
localparam START_ROW_INDEX = get_current_row_index(gen_y);
|
||||
|
||||
|
||||
for (gen_x=0; gen_x<column_count; gen_x =gen_x +1)
|
||||
begin:column
|
||||
|
||||
localparam DATA_MAP_INDEX = START_ROW_INDEX+gen_x;
|
||||
|
||||
localparam WDATA_END = bram_mapping_table(DATA_MAP_INDEX,2);
|
||||
localparam WDATA_START = bram_mapping_table(DATA_MAP_INDEX,3);
|
||||
localparam WDATA_REPART = bram_mapping_table(DATA_MAP_INDEX,4);
|
||||
localparam WRSEL_INDEX = bram_mapping_table(DATA_MAP_INDEX,6);
|
||||
localparam BYTEEN_INDEX = bram_mapping_table(DATA_MAP_INDEX,8);
|
||||
|
||||
localparam RDATA_END = bram_mapping_table(DATA_MAP_INDEX,9);
|
||||
localparam RDATA_START = bram_mapping_table(DATA_MAP_INDEX,10);
|
||||
localparam RDATA_REPART = bram_mapping_table(DATA_MAP_INDEX,11);
|
||||
localparam RMUX_INDEX = bram_mapping_table(DATA_MAP_INDEX,12);
|
||||
|
||||
|
||||
|
||||
wire [WADDR_WIDTH_ROW-1:0] w_waddr;
|
||||
wire [WDATA_WIDTH_ROW-1:0] w_wdata;
|
||||
wire [WEN_WIDTH_ROW-1:0] w_we;
|
||||
|
||||
wire [RADDR_WIDTH_ROW-1:0] w_raddr;
|
||||
wire [RDATA_WIDTH_ROW-1:0] w_rdata;
|
||||
|
||||
//assign w_waddr[WADDR_WIDTH_ROW-1:0] = w_waddr_map[WADDR_WIDTH_ROW-1:0];
|
||||
//assign w_raddr[RADDR_WIDTH_ROW-1:0] = w_raddr_map[RADDR_WIDTH_ROW-1:0];
|
||||
|
||||
for(gen_z=0;gen_z<WADDR_WIDTH_ROW; gen_z=gen_z+1)
|
||||
begin
|
||||
if(gen_z< ADDR_WIDTH_A)
|
||||
assign w_waddr[gen_z] = w_waddr_map[gen_z];
|
||||
else
|
||||
assign w_waddr[gen_z] = 1'b0;
|
||||
end
|
||||
|
||||
for(gen_z=0;gen_z<RADDR_WIDTH_ROW; gen_z=gen_z+1)
|
||||
begin
|
||||
if(gen_z< ADDR_WIDTH_B)
|
||||
assign w_raddr[gen_z] = w_raddr_map[gen_z];
|
||||
else
|
||||
assign w_raddr[gen_z] = 1'b0;
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
if (WDATA_REPART == 0)
|
||||
begin
|
||||
assign w_wdata[WDATA_WIDTH_ROW-1:0] = w_wdata_map[WDATA_END:WDATA_START];
|
||||
end
|
||||
else
|
||||
begin
|
||||
//for Mixed Width Mode
|
||||
for (gen_z=0; gen_z<WDATA_REPART; gen_z = gen_z+1)
|
||||
begin:MIXED_WIDTH_MAPPING
|
||||
localparam MIXED_WDATA_START = WDATA_START + gen_z*column_count*(RDATA_END - RDATA_START+1); // RDATA_WIDTH_ROW;
|
||||
localparam MIXED_WDATA_END = WDATA_END + gen_z*column_count*(RDATA_END - RDATA_START+1); //RDATA_WIDTH_ROW;
|
||||
|
||||
localparam MAPPED_WDATA_START = RDATA_WIDTH_ROW* gen_z;
|
||||
localparam MAPPED_WDATA_END = RDATA_WIDTH_ROW*(gen_z+1) -1;
|
||||
|
||||
|
||||
assign w_wdata[MAPPED_WDATA_END: MAPPED_WDATA_START] = w_wdata_map[MIXED_WDATA_END:MIXED_WDATA_START];
|
||||
end
|
||||
end
|
||||
|
||||
if (RDATA_REPART == 0)
|
||||
begin
|
||||
assign rMux[RMUX_INDEX][RDATA_END:RDATA_START] = w_rdata[RDATA_WIDTH_ROW-1:0];
|
||||
end
|
||||
else
|
||||
begin
|
||||
//for Mixed Width Mode
|
||||
for (gen_z=0; gen_z<RDATA_REPART; gen_z = gen_z+1)
|
||||
begin:MIXED_WIDTH_MAPPING
|
||||
localparam MIXED_RDATA_START = RDATA_START + gen_z*column_count*(WDATA_END - WDATA_START+1); //WDATA_WIDTH_ROW;
|
||||
localparam MIXED_RDATA_END = RDATA_END + gen_z*column_count*(WDATA_END - WDATA_START+1); //WDATA_WIDTH_ROW;
|
||||
|
||||
localparam MAPPED_RDATA_START = WDATA_WIDTH_ROW* gen_z;
|
||||
localparam MAPPED_RDATA_END = WDATA_WIDTH_ROW*(gen_z+1) -1;
|
||||
|
||||
|
||||
assign rMux[RMUX_INDEX][MIXED_RDATA_END:MIXED_RDATA_START] = w_rdata[MAPPED_RDATA_END:MAPPED_RDATA_START];
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
assign w_we[0] = ((we == WE_POLARITY) & wen_decode[WRSEL_INDEX] & (byteen[BYTEEN_INDEX] == BYTEEN_POLARITY)) ? WE_POLARITY: !WE_POLARITY;;
|
||||
if ( WEN_WIDTH_ROW >1)
|
||||
begin
|
||||
assign w_we[1] = ((we == WE_POLARITY) & wen_decode[WRSEL_INDEX] & (byteen[BYTEEN_INDEX] == BYTEEN_POLARITY)) ? WE_POLARITY: !WE_POLARITY;;
|
||||
end
|
||||
|
||||
bram_primitive #(
|
||||
.FAMILY(FAMILY), //0:Trion, 1:Titanium
|
||||
|
||||
//Trion and Titanium parameters
|
||||
.WRITE_WIDTH(WDATA_WIDTH_ROW),
|
||||
.WCLK_POLARITY(WCLK_POLARITY),
|
||||
.WCLKE_POLARITY(WCLKE_POLARITY),
|
||||
.WE_POLARITY(WE_POLARITY),
|
||||
.WRITE_MODE(WRITE_MODE),
|
||||
|
||||
.READ_WIDTH(RDATA_WIDTH_ROW),
|
||||
.RCLK_POLARITY(RCLK_POLARITY),
|
||||
.RE_POLARITY(RE_POLARITY),
|
||||
.OUTPUT_REG(OUTPUT_REG),
|
||||
|
||||
//Titanium extra paramters
|
||||
.RST_POLARITY(RST_POLARITY),
|
||||
.RESET_RAM(RESET_RAM),
|
||||
.RESET_OUTREG(RESET_OUTREG),
|
||||
.WADDREN_POLARITY(WADDREN_POLARITY),
|
||||
.RADDREN_POLARITY(RADDREN_POLARITY),
|
||||
|
||||
.WEN_WIDTH(WEN_WIDTH_ROW),
|
||||
|
||||
.ini_index(DATA_MAP_INDEX)
|
||||
|
||||
) bram (
|
||||
//Trion and Titanium ports
|
||||
.WCLK(wclk), // Write clock input
|
||||
.WCLKE(wclke), // Write clock-enable input
|
||||
.WE(w_we), // Write-enable input
|
||||
.WADDR(w_waddr), // Write address input
|
||||
.WDATA(w_wdata), // Write data input
|
||||
|
||||
.RCLK(rclk), // Read clock input
|
||||
.RE(re), // Read-enable input
|
||||
.RADDR(w_raddr), // Read address input
|
||||
.RDATA(w_rdata), // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
.RST(reset), // reset
|
||||
.WADDREN(waddren), // write address enable
|
||||
.RADDREN(raddren) // read address enable
|
||||
);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
endgenerate
|
||||
|
||||
|
||||
endmodule
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,420 +0,0 @@
|
||||
"""
|
||||
|
||||
Copyright (C) 2022 Efinix Inc. All rights reserved.
|
||||
|
||||
No portion of this code may be reused, modified or
|
||||
distributed in any way without the expressed written
|
||||
consent of Efinix Inc.
|
||||
|
||||
Created on Dec 22, 2021
|
||||
|
||||
@author: Dragon Lai
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
import argparse
|
||||
import math
|
||||
import json
|
||||
|
||||
from enum import Enum
|
||||
|
||||
FAMILY = 0
|
||||
in_addr_width_a = 0
|
||||
in_data_width_a = 0
|
||||
in_addr_width_b = 0
|
||||
in_data_width_b = 0
|
||||
|
||||
actual_size_A = 0
|
||||
actual_size_B = 0
|
||||
byteen_width = 0
|
||||
group_data_width = 0
|
||||
group_columns = 0
|
||||
|
||||
bram_decompose_mode = 0
|
||||
bram_feature_table = list()
|
||||
group_columns = list()
|
||||
|
||||
bram_decompose_table = list()
|
||||
bram_mapping_table = list()
|
||||
rMux_mapping_table_A = list()
|
||||
wen_sel_mapping_table_A = list()
|
||||
rMux_mapping_table_B = list()
|
||||
wen_sel_mapping_table_B = list()
|
||||
|
||||
data_mapping_table_A = list()
|
||||
data_mapping_table_B = list()
|
||||
|
||||
address_mapping_table_A = list()
|
||||
address_mapping_table_B = list()
|
||||
|
||||
|
||||
mem_table = list()
|
||||
|
||||
def remove_comment(InString):
|
||||
|
||||
result = False
|
||||
|
||||
outString = InString
|
||||
|
||||
#find comment sytnax '//'
|
||||
Index_start = InString.find('//')
|
||||
|
||||
|
||||
#find end of line \n after //
|
||||
if (Index_start != -1 ):
|
||||
Index_end = InString.find('\n',Index_start)
|
||||
|
||||
if (Index_end == -1):
|
||||
Index_end = len(InString)
|
||||
|
||||
if (Index_start == 0 ):
|
||||
outString = InString[Index_end:]
|
||||
else:
|
||||
outString = InString[:Index_start] + InString[Index_end:]
|
||||
|
||||
result = True
|
||||
|
||||
return result, outString
|
||||
|
||||
def remove_comments(InString):
|
||||
|
||||
result = True
|
||||
TempString = InString
|
||||
|
||||
while(result):
|
||||
result, OutString = remove_comment(TempString)
|
||||
TempString = OutString
|
||||
|
||||
return OutString
|
||||
|
||||
def dump2memTable(InString,in_format, port, in_data_width, in_addr_width):
|
||||
ProcesseData = remove_comments(InString)
|
||||
|
||||
#print( in_format, in_data_width, in_addr_width)
|
||||
|
||||
#print(ProcesseData)
|
||||
|
||||
lines = ProcesseData.split()
|
||||
|
||||
#print(lines)
|
||||
|
||||
bit_count = 1
|
||||
|
||||
if (in_format == 'hex'):
|
||||
bit_count = 4
|
||||
|
||||
line_ptr = 0
|
||||
for line in lines:
|
||||
if (line_ptr+1) > (2**in_addr_width):
|
||||
break
|
||||
|
||||
bit_ptr = 0
|
||||
|
||||
for bits in reversed(line):
|
||||
|
||||
if (bit_ptr+1) > in_data_width:
|
||||
break
|
||||
|
||||
value = int(bits, 16)
|
||||
|
||||
|
||||
for x in range(0,bit_count):
|
||||
# print ( line_ptr, bit_ptr)
|
||||
if (bit_ptr+1) > in_data_width:
|
||||
break
|
||||
|
||||
mem_table[line_ptr][bit_ptr] = (value % 2)
|
||||
|
||||
value = int(value / 2)
|
||||
bit_ptr = bit_ptr + 1
|
||||
|
||||
#print(mem_table[line_ptr])
|
||||
line_ptr = line_ptr+1
|
||||
|
||||
|
||||
#print(mem_table)
|
||||
create_memory_init_file(port,in_data_width, in_addr_width )
|
||||
|
||||
|
||||
def create_prmitive_map(data_width, addr_width, primitive_addr_width, primiive_data_width, map_data_msb, map_data_lsb, repeat, interval, row_index):
|
||||
|
||||
#print(data_width, addr_width, primitive_addr_width, primiive_data_width, map_data_msb, map_data_lsb, repeat, row_index)
|
||||
#print(data_width, addr_width, primitive_addr_width, primiive_data_width, map_data_msb, map_data_lsb, repeat, interval, row_index)
|
||||
|
||||
primitive_mem = list()
|
||||
|
||||
#initial primitive memory profile
|
||||
for y in range(0,(2**primitive_addr_width)):
|
||||
row = list()
|
||||
for x in range(0,primiive_data_width):
|
||||
row.append(int(0))
|
||||
primitive_mem.append(row)
|
||||
|
||||
|
||||
primitive_y = int(0)
|
||||
primitive_x = int(0)
|
||||
|
||||
addr_start = row_index * (2**primitive_addr_width)
|
||||
addr_End = (row_index+1)* (2**primitive_addr_width) -1
|
||||
|
||||
#print(addr_start, addr_End, primiive_data_width, map_data_lsb,map_data_msb )
|
||||
|
||||
if(addr_End > (2**addr_width)-1):
|
||||
addr_End = (2**addr_width)-1
|
||||
|
||||
for y in range(addr_start, addr_End+1 ):
|
||||
init_row = mem_table[y]
|
||||
|
||||
primitive_x = int(0)
|
||||
if repeat == 0:
|
||||
for x in range(map_data_lsb, map_data_msb +1 ) :
|
||||
if (primitive_x+1) > primiive_data_width:
|
||||
break
|
||||
|
||||
primitive_mem[primitive_y][primitive_x] = init_row[x]
|
||||
primitive_x = primitive_x+1
|
||||
|
||||
#if (map_data_lsb == 10 ):
|
||||
# print (y, primitive_y,primitive_x, primitive_mem[primitive_y], init_row, map_data_lsb,( map_data_msb-map_data_lsb) +1 )
|
||||
else:
|
||||
for r_x in range(0,repeat):
|
||||
temp_data_lsb = map_data_lsb + (interval * r_x)
|
||||
temp_data_msb = map_data_msb + (interval * r_x)
|
||||
for x in range(temp_data_lsb, temp_data_msb +1 ) :
|
||||
if (primitive_x+1) > primiive_data_width:
|
||||
break
|
||||
|
||||
primitive_mem[primitive_y][primitive_x] = init_row[x]
|
||||
primitive_x = primitive_x+1
|
||||
|
||||
primitive_y = primitive_y+1
|
||||
|
||||
|
||||
#print(primitive_mem)
|
||||
converted_init_mem = list()
|
||||
|
||||
#initial primitive init profile
|
||||
for y in range(0,40):
|
||||
row =list()
|
||||
for x in range(0,32):
|
||||
row.append(int(0))
|
||||
converted_init_mem.append(row)
|
||||
|
||||
|
||||
#initial primitive memory profile
|
||||
|
||||
primitive_bit_ptr = int(0)
|
||||
primitive_byte = int(0)
|
||||
|
||||
primitive_x_ptr = int(31)
|
||||
primitive_y_ptr = int(0)
|
||||
|
||||
|
||||
for y in range(0,(2**primitive_addr_width)):
|
||||
for x in range(0,primiive_data_width):
|
||||
primitive_byte = primitive_byte + primitive_mem[y][x] * (2** primitive_bit_ptr)
|
||||
|
||||
primitive_bit_ptr = primitive_bit_ptr + 1
|
||||
if primitive_bit_ptr >= 8:
|
||||
converted_init_mem[primitive_y_ptr][primitive_x_ptr] = primitive_byte
|
||||
primitive_bit_ptr = 0
|
||||
primitive_byte = 0
|
||||
|
||||
primitive_x_ptr = primitive_x_ptr-1
|
||||
if primitive_x_ptr < 0:
|
||||
primitive_x_ptr = 31
|
||||
|
||||
primitive_y_ptr = primitive_y_ptr +1
|
||||
if primitive_y_ptr >= 40:
|
||||
break
|
||||
|
||||
|
||||
return converted_init_mem
|
||||
|
||||
def create_memory_init_file(port, data_width, addr_width ):
|
||||
f = open("bram_ini.vh", "w")
|
||||
|
||||
line = '\n'
|
||||
line += 'function [255:0] bram_ini_table;\n'
|
||||
line += 'input integer index;//Mode type \n'
|
||||
line += 'input integer val_; //Port A index, Port B Index, Number of Items in Loop, Port A Start, Port B Start, reserved \n'
|
||||
line += 'case (index)\n'
|
||||
f.write (line)
|
||||
y = 0
|
||||
|
||||
for row in bram_mapping_table:
|
||||
|
||||
line = ""
|
||||
x = 0
|
||||
|
||||
line += '%4s: bram_ini_table=\n' %(y)
|
||||
|
||||
index_primitive_row = row[0]
|
||||
index_primitive_column = row[1]
|
||||
|
||||
DataA_MSB = row[2]
|
||||
DataA_LSB = row[3]
|
||||
DataA_REPEAT = row[4]
|
||||
DataA_RdMux = row[5]
|
||||
|
||||
DataB_MSB = row[9]
|
||||
DataB_LSB = row[10]
|
||||
DataB_REPEAT = row[11]
|
||||
DataB_RdMux = row[12]
|
||||
|
||||
|
||||
primitive_addrW_A = row[16]
|
||||
primitive_dataW_A = row[17]
|
||||
primitive_addrW_B = row[18]
|
||||
primitive_dataW_B = row[19]
|
||||
|
||||
maptable = list()
|
||||
|
||||
if port == 'a':
|
||||
maptable = create_prmitive_map(data_width, addr_width, primitive_addrW_A, primitive_dataW_A, DataA_MSB, DataA_LSB, DataA_REPEAT, in_data_width_b, DataA_RdMux)
|
||||
|
||||
|
||||
elif port == 'b':
|
||||
maptable = create_prmitive_map(data_width, addr_width, primitive_addrW_B, primitive_dataW_B, DataB_MSB, DataB_LSB, DataB_REPEAT, in_data_width_a, DataB_RdMux)
|
||||
|
||||
|
||||
|
||||
|
||||
stringline = ""
|
||||
|
||||
for Values in maptable:
|
||||
stringline ="256'h"
|
||||
for value in Values:
|
||||
stringline += '%02x' % (value)
|
||||
|
||||
line += '(val_==%2s)?' % (x)
|
||||
line += stringline
|
||||
line += ":\n"
|
||||
x = x + 1
|
||||
line += '0;\n'
|
||||
f.write (line)
|
||||
|
||||
|
||||
#stringline ="256'h"
|
||||
#for hexChar in range(0,32):
|
||||
# #stringline += '%02x' % (y)
|
||||
# stringline += '%02x' % (0)
|
||||
#
|
||||
#
|
||||
#for x in range(0, 40):
|
||||
# #line += '(val_==' + str(x) + ')?' + str(feature) + ':'
|
||||
# line += '(val_==%2s)?' % (x)
|
||||
#
|
||||
# line += stringline
|
||||
# #line += "256'h0000000000000000000000000000000000000000000000000000000000000000"
|
||||
#
|
||||
# line += ":\n"
|
||||
# x = x + 1
|
||||
#line += '0;\n'
|
||||
#f.write (line)
|
||||
|
||||
|
||||
|
||||
y = y +1
|
||||
|
||||
|
||||
line = ""
|
||||
line += " endcase\n"
|
||||
line += "endfunction \n"
|
||||
f.write (line)
|
||||
|
||||
|
||||
|
||||
|
||||
f.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
parser = argparse.ArgumentParser(description='Memory Decompose to BRAM')
|
||||
parser.add_argument("format", choices=['hex', 'bin'], help="Memory file format")
|
||||
parser.add_argument("init_file", help="Input file name")
|
||||
parser.add_argument("--port", choices=['a', 'b'], default='b', help="inital data width based on port A(Write) , or port B(Read)")
|
||||
|
||||
|
||||
# run parser
|
||||
args = parser.parse_args()
|
||||
text_file = open(args.init_file, "r")
|
||||
|
||||
try:
|
||||
with open('mem_config.txt', 'r') as f:
|
||||
mem_config = json.loads(f.read())
|
||||
FAMILY = mem_config[0]
|
||||
in_addr_width_a = mem_config[1]
|
||||
in_data_width_a = mem_config[2]
|
||||
in_addr_width_b = mem_config[3]
|
||||
in_data_width_b = mem_config[4]
|
||||
|
||||
actual_size_A = mem_config[5]
|
||||
actual_size_B = mem_config[6]
|
||||
byteen_width = mem_config[7]
|
||||
group_data_width = mem_config[8]
|
||||
group_columns = mem_config[9]
|
||||
|
||||
bram_decompose_mode = mem_config[10]
|
||||
bram_feature_table = mem_config[11]
|
||||
group_columns = mem_config[12]
|
||||
|
||||
bram_decompose_table = mem_config[13]
|
||||
bram_mapping_table = mem_config[14]
|
||||
rMux_mapping_table_A = mem_config[15]
|
||||
wen_sel_mapping_table_A = mem_config[16]
|
||||
rMux_mapping_table_B = mem_config[17]
|
||||
wen_sel_mapping_table_B = mem_config[18]
|
||||
|
||||
data_mapping_table_A = mem_config[19]
|
||||
data_mapping_table_B = mem_config[20]
|
||||
|
||||
address_mapping_table_A = mem_config[21]
|
||||
address_mapping_table_B = mem_config[22]
|
||||
|
||||
data_width = 0
|
||||
addr_width = 0
|
||||
|
||||
|
||||
if args.port == 'a':
|
||||
data_width = in_data_width_a
|
||||
addr_width = in_addr_width_a
|
||||
|
||||
elif args.port == 'b':
|
||||
data_width = in_data_width_b
|
||||
addr_width = in_addr_width_b
|
||||
|
||||
for y in range(0,2 ** addr_width):
|
||||
column = list()
|
||||
for x in range(0,data_width):
|
||||
column.append(0)
|
||||
mem_table.append(column)
|
||||
|
||||
|
||||
|
||||
|
||||
#read whole file to a string
|
||||
InString = text_file.read()
|
||||
result = "Data width = " + str(data_width) + " Address width = " + str(addr_width)
|
||||
print (result)
|
||||
print ("Status : Memory Initialization has completed")
|
||||
dump2memTable(InString,args.format,args.port, data_width, addr_width)
|
||||
|
||||
#close file
|
||||
text_file.close()
|
||||
|
||||
|
||||
|
||||
except OSError as e:
|
||||
print(f"{type(e)}: {e}")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// _____
|
||||
// / _______ Copyright (C) 2013-2022 Efinix Inc. All rights reserved.
|
||||
// / / \
|
||||
// / / .. / efx_single_port_ram.v
|
||||
// / / .' /
|
||||
// __/ /.' / Description:
|
||||
// __ \ /
|
||||
// /_/ /\ \_____/ /
|
||||
// ____/ \_______/
|
||||
//
|
||||
// *******************************
|
||||
// Revisions:
|
||||
// 0.0 Initial rev
|
||||
//
|
||||
// *******************************
|
||||
|
||||
module efx_single_port_ram #(
|
||||
//Trion and Titanium parameters
|
||||
parameter CLK_POLARITY = 1'b1, //clk polarity, 0:falling edge, 1:rising edge
|
||||
|
||||
parameter WCLKE_POLARITY = 1'b1, //wclke polarity, 0:active low, 1:active high
|
||||
parameter WE_POLARITY = 1'b1, //we polarity, 0:active low, 1:active high
|
||||
parameter WRITE_MODE = "READ_UNKNOWN",//write mode, "READ_FIRST" :Old memory content is read. (default)
|
||||
// "WRITE_FIRST" :Write data is passed to the read port.
|
||||
// "READ_UNKNOWN": Read and writes are unsynchronized, therefore, the results of the address can conflict.
|
||||
parameter RE_POLARITY = 1'b1, // re polarity, 0:active low , 1:active high
|
||||
parameter OUTPUT_REG = 1'b0, // Output register enable, 1:add pipe-line read register
|
||||
|
||||
parameter BYTEEN_POLARITY = 1'b1, //byteen polarity, 0:active low, 1:active high
|
||||
|
||||
//Port Enable
|
||||
parameter WCLKE_ENABLE = 1'b1, //1: Enable the port for waddren pin , 0: disable
|
||||
|
||||
parameter WE_ENABLE = 1'b1, //1: Enable the port for WE pin , 0: disable
|
||||
parameter RE_ENABLE = 1'b1, //1: Enable the port for RE pin , 0: disable
|
||||
parameter BYTEEN_ENABLE = 1'b1, //1: Enable the port for Byteen pins , 0: disable
|
||||
|
||||
//Titanium extra paramters
|
||||
parameter RST_POLARITY = 1'b1, // rst polarity
|
||||
parameter RESET_RAM = "ASYNC", // reset mode on ram, "NONE": RST signals does not affect the RAM output.
|
||||
// "ASYNC": RAM output resets asynchronously to RCLK.
|
||||
// "SYNC": RAM output resets synchronously to RCLK.
|
||||
parameter RESET_OUTREG = "ASYNC", // reset mode on output register
|
||||
// "NONE": RST signals does not affect the RAM output register
|
||||
// "ASYNC": RAM output register resets asynchronously to RCLK.
|
||||
parameter ADDREN_POLARITY = 1'b1, // addren polarity
|
||||
|
||||
|
||||
//Port Enable
|
||||
parameter RESET_ENABLE = 1'b1, //1: Enable the port for reset pin , 0: disable
|
||||
|
||||
parameter ADDREN_ENABLE = 1'b1 //1: Enable the port for addren pin , 0: disable
|
||||
|
||||
)
|
||||
(
|
||||
//Trion and Titanium ports
|
||||
clk, // clock input for one clock mode
|
||||
addr, // address input
|
||||
|
||||
wclke, // Write clock-enable input
|
||||
byteen, // Byteen input
|
||||
we, // Write-enable input
|
||||
wdata, // Write data input
|
||||
|
||||
re, // Read-enable input
|
||||
rdata, // Read data output
|
||||
|
||||
//Titanium extra ports
|
||||
reset, // reset
|
||||
addren, // address enable
|
||||
);
|
||||
|
||||
`include "bram_decompose.vh"
|
||||
|
||||
//Trion and Titanium ports
|
||||
input clk;
|
||||
input [ADDR_WIDTH_A-1:0] addr;
|
||||
|
||||
input wclke;
|
||||
input [BYTEEN_WIDTH-1:0] byteen;
|
||||
input we;
|
||||
input [DATA_WIDTH_A-1:0] wdata;
|
||||
|
||||
input re;
|
||||
output [DATA_WIDTH_B-1:0] rdata;
|
||||
|
||||
//Titanium extra ports
|
||||
input reset;
|
||||
input addren;
|
||||
|
||||
wire w_wclk;
|
||||
wire w_rclk;
|
||||
wire w_wclke;
|
||||
wire [BYTEEN_WIDTH-1:0] w_byteen;
|
||||
wire w_we;
|
||||
wire w_re;
|
||||
wire w_reset;
|
||||
wire w_addren;
|
||||
|
||||
assign w_wclke = (WCLKE_ENABLE==1) ? wclke : WCLKE_POLARITY;
|
||||
assign w_byteen= (BYTEEN_ENABLE==1) ? byteen : {BYTEEN_WIDTH{BYTEEN_POLARITY}};
|
||||
assign w_we = (WE_ENABLE==1) ? we : WE_POLARITY;
|
||||
assign w_re = (RE_ENABLE==1) ? re : RE_POLARITY;
|
||||
|
||||
//Titanium extra ports
|
||||
assign w_reset = (RESET_ENABLE==1) ? reset : (RST_POLARITY==1'b1) ? 1'b0: 1'b1;
|
||||
assign w_addren = (ADDREN_ENABLE==1)? addren : ADDREN_POLARITY;
|
||||
|
||||
bram_wrapper_mwm #(
|
||||
//.FAMILY(FAMILY),
|
||||
//Trion and Titanium parameters
|
||||
.WCLK_POLARITY(CLK_POLARITY),
|
||||
.WCLKE_POLARITY(WCLKE_POLARITY),
|
||||
.WE_POLARITY(WE_POLARITY),
|
||||
.WRITE_MODE(WRITE_MODE),
|
||||
|
||||
.RCLK_POLARITY(CLK_POLARITY),
|
||||
.RE_POLARITY(RE_POLARITY),
|
||||
.OUTPUT_REG(OUTPUT_REG),
|
||||
|
||||
.BYTEEN_POLARITY(BYTEEN_POLARITY),
|
||||
|
||||
//Titanium extra paramters
|
||||
.RST_POLARITY(RST_POLARITY),
|
||||
.RESET_RAM(RESET_RAM),
|
||||
.RESET_OUTREG(RESET_OUTREG),
|
||||
.WADDREN_POLARITY(ADDREN_POLARITY),
|
||||
.RADDREN_POLARITY(ADDREN_POLARITY)
|
||||
|
||||
) brams (
|
||||
.wclk(clk),
|
||||
.wclke(w_wclke),
|
||||
.we(w_we),
|
||||
.byteen(w_byteen),
|
||||
|
||||
.waddr(addr),
|
||||
.wdata(wdata),
|
||||
|
||||
.rclk(clk),
|
||||
.re(w_re),
|
||||
.raddr(addr),
|
||||
.rdata(rdata),
|
||||
|
||||
|
||||
//Titanium extra ports
|
||||
.reset(w_reset), // reset
|
||||
.waddren(w_addren), // write address enable
|
||||
.raddren(w_addren) // read address enable
|
||||
);
|
||||
|
||||
|
||||
endmodule
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,256 +0,0 @@
|
||||
20
|
||||
27
|
||||
ff
|
||||
a9
|
||||
00
|
||||
20
|
||||
30
|
||||
ff
|
||||
ea
|
||||
a9
|
||||
18
|
||||
3a
|
||||
d0
|
||||
fd
|
||||
a9
|
||||
aa
|
||||
85
|
||||
10
|
||||
e6
|
||||
11
|
||||
a9
|
||||
08
|
||||
20
|
||||
30
|
||||
ff
|
||||
a9
|
||||
10
|
||||
a2
|
||||
00
|
||||
20
|
||||
80
|
||||
ff
|
||||
a5
|
||||
10
|
||||
f0
|
||||
ea
|
||||
cb
|
||||
80
|
||||
fd
|
||||
64
|
||||
10
|
||||
64
|
||||
11
|
||||
64
|
||||
12
|
||||
64
|
||||
13
|
||||
60
|
||||
48
|
||||
a5
|
||||
10
|
||||
8d
|
||||
d8
|
||||
ef
|
||||
a5
|
||||
11
|
||||
8d
|
||||
d9
|
||||
ef
|
||||
a5
|
||||
12
|
||||
8d
|
||||
da
|
||||
ef
|
||||
a5
|
||||
13
|
||||
8d
|
||||
db
|
||||
ef
|
||||
68
|
||||
8d
|
||||
dc
|
||||
ef
|
||||
60
|
||||
5a
|
||||
85
|
||||
08
|
||||
86
|
||||
09
|
||||
a9
|
||||
00
|
||||
a0
|
||||
00
|
||||
91
|
||||
08
|
||||
c8
|
||||
91
|
||||
08
|
||||
c8
|
||||
91
|
||||
08
|
||||
c8
|
||||
91
|
||||
08
|
||||
ad
|
||||
dc
|
||||
ef
|
||||
29
|
||||
01
|
||||
f0
|
||||
f9
|
||||
ad
|
||||
d8
|
||||
ef
|
||||
a0
|
||||
00
|
||||
91
|
||||
08
|
||||
ad
|
||||
d9
|
||||
ef
|
||||
c8
|
||||
91
|
||||
08
|
||||
ad
|
||||
da
|
||||
ef
|
||||
c8
|
||||
91
|
||||
08
|
||||
ad
|
||||
db
|
||||
ef
|
||||
c8
|
||||
91
|
||||
08
|
||||
7a
|
||||
60
|
||||
5a
|
||||
85
|
||||
08
|
||||
86
|
||||
09
|
||||
a9
|
||||
00
|
||||
a0
|
||||
00
|
||||
91
|
||||
08
|
||||
c8
|
||||
91
|
||||
08
|
||||
c8
|
||||
91
|
||||
08
|
||||
c8
|
||||
91
|
||||
08
|
||||
a0
|
||||
12
|
||||
88
|
||||
f0
|
||||
26
|
||||
ad
|
||||
dc
|
||||
ef
|
||||
29
|
||||
01
|
||||
f0
|
||||
f6
|
||||
ad
|
||||
d8
|
||||
ef
|
||||
a0
|
||||
00
|
||||
91
|
||||
08
|
||||
ad
|
||||
d9
|
||||
ef
|
||||
c8
|
||||
91
|
||||
08
|
||||
ad
|
||||
da
|
||||
ef
|
||||
c8
|
||||
91
|
||||
08
|
||||
ad
|
||||
db
|
||||
ef
|
||||
c8
|
||||
91
|
||||
08
|
||||
7a
|
||||
a9
|
||||
00
|
||||
a2
|
||||
00
|
||||
60
|
||||
7a
|
||||
a9
|
||||
ff
|
||||
a2
|
||||
ff
|
||||
60
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
ff
|
||||
00
|
||||
ff
|
||||
00
|
||||
ff
|
||||
@@ -1 +0,0 @@
|
||||
[0, 8, 8, 8, 8, 256, 256, 1, 8, 1, 1, [[8, 20, 2, 0, 0], [9, 10, 1, 0, 0], [10, 5, 1, 0, 0], [8, 16, 2, 0, 1], [9, 8, 1, 0, 1], [10, 4, 1, 0, 1], [11, 2, 1, 0, 1], [12, 1, 1, 0, 1]], 1, [[0, 0, 1, 0, 0]], [[0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 8, 20, 8, 20]], [], [], [], [], [], [], [], []]
|
||||
49
hw/efinix_fpga/rom.sv
Normal file
49
hw/efinix_fpga/rom.sv
Normal file
@@ -0,0 +1,49 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2013-2018 Efinix Inc. All rights reserved.
|
||||
//
|
||||
// Single Port ROM
|
||||
//
|
||||
// *******************************
|
||||
// Revisions:
|
||||
// 0.0 Initial rev
|
||||
// 1.0 Finalized RTL macro
|
||||
// *******************************
|
||||
|
||||
module rom
|
||||
#(
|
||||
parameter DATA_WIDTH = 16,
|
||||
parameter ADDR_WIDTH = 8,
|
||||
parameter OUTPUT_REG = "FALSE",
|
||||
parameter RAM_INIT_FILE = "init_hex.mem"
|
||||
)
|
||||
(
|
||||
input [ADDR_WIDTH-1:0] addr,
|
||||
input clk,
|
||||
output [DATA_WIDTH-1:0] data
|
||||
);
|
||||
localparam MEMORY_DEPTH = 2**ADDR_WIDTH;
|
||||
|
||||
reg [DATA_WIDTH-1:0]r_rdata_1P;
|
||||
reg [DATA_WIDTH-1:0]r_rdata_2P;
|
||||
|
||||
reg [DATA_WIDTH-1:0] rom[MEMORY_DEPTH-1:0];
|
||||
|
||||
initial begin
|
||||
$readmemh(RAM_INIT_FILE, rom);
|
||||
end
|
||||
|
||||
always@(posedge clk)
|
||||
begin
|
||||
r_rdata_1P <= rom[addr];
|
||||
r_rdata_2P <= r_rdata_1P;
|
||||
end
|
||||
|
||||
generate
|
||||
if (OUTPUT_REG == "TRUE")
|
||||
assign data = r_rdata_2P;
|
||||
else
|
||||
assign data = r_rdata_1P;
|
||||
endgenerate
|
||||
|
||||
endmodule
|
||||
@@ -139,16 +139,10 @@ always_comb begin
|
||||
cpu_data_out = 'x;
|
||||
end
|
||||
|
||||
|
||||
efx_single_port_ram boot_rom(
|
||||
.clk(clk_2), // clock input for one clock mode
|
||||
.addr(cpu_addr[7:0]), // address input
|
||||
.wclke('0), // Write clock-enable input
|
||||
.byteen('0), // Byteen input
|
||||
.we('0), // Write-enable input
|
||||
|
||||
.re(cpu_rwb & w_rom_cs), // Read-enable input
|
||||
.rdata(w_rom_data_out) // Read data output
|
||||
rom #(.DATA_WIDTH(8), .ADDR_WIDTH(12)) u_rom(
|
||||
.addr(cpu_addr[11:0]),
|
||||
.clk(clk_2),
|
||||
.data(w_rom_data_out)
|
||||
);
|
||||
|
||||
leds u_leds(
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
MEMORY
|
||||
{
|
||||
ZP: start = $0, size = $100, type = rw, define = yes;
|
||||
SDRAM: start = $200, size = $ff00, type = rw, define = yes;
|
||||
ROM: start = $ff00, size = $100, file = %O;
|
||||
SDRAM: start = $200, size = $ee00, type = rw, define = yes;
|
||||
ROM: start = $f000, size = $1000, file = %O;
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
|
||||
Reference in New Issue
Block a user