diff options
author | KrystalDelusion <krystinedawn@yosyshq.com> | 2022-07-07 10:22:14 +1200 |
---|---|---|
committer | KrystalDelusion <krystinedawn@yosyshq.com> | 2023-02-21 05:23:14 +1300 |
commit | 48f4e0920291c3163ac9d987a62bdc6deed722f6 (patch) | |
tree | 541ba4e503533bdc4e276ae2e71bc8b7dd9c5698 /tests/arch/xilinx/asym_ram_sdp_read_wider.v | |
parent | ac5fa9a83883ede45fac38c7288f8ade1887ade5 (diff) | |
download | yosys-48f4e0920291c3163ac9d987a62bdc6deed722f6.tar.gz yosys-48f4e0920291c3163ac9d987a62bdc6deed722f6.tar.bz2 yosys-48f4e0920291c3163ac9d987a62bdc6deed722f6.zip |
Asymmetric port ram tests with Xilinx
Uses verilog code from User Guide 901 (2021.1)
Diffstat (limited to 'tests/arch/xilinx/asym_ram_sdp_read_wider.v')
-rw-r--r-- | tests/arch/xilinx/asym_ram_sdp_read_wider.v | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/tests/arch/xilinx/asym_ram_sdp_read_wider.v b/tests/arch/xilinx/asym_ram_sdp_read_wider.v new file mode 100644 index 000000000..8743209e3 --- /dev/null +++ b/tests/arch/xilinx/asym_ram_sdp_read_wider.v @@ -0,0 +1,72 @@ +// Asymmetric port RAM +// Read Wider than Write. Read Statement in loop +//asym_ram_sdp_read_wider.v +module asym_ram_sdp_read_wider (clkA, clkB, enaA, weA, enaB, addrA, addrB, diA, doB); + parameter WIDTHA = 4; + parameter SIZEA = 1024; + parameter ADDRWIDTHA = 10; + + parameter WIDTHB = 16; + parameter SIZEB = 256; + parameter ADDRWIDTHB = 8; + + input clkA; + input clkB; + input weA; + input enaA, enaB; + input [ADDRWIDTHA-1:0] addrA; + input [ADDRWIDTHB-1:0] addrB; + input [WIDTHA-1:0] diA; + output [WIDTHB-1:0] doB; + + `define max(a,b) {(a) > (b) ? (a) : (b)} + `define min(a,b) {(a) < (b) ? (a) : (b)} + + function integer log2; + input integer value; + reg [31:0] shifted; + integer res; + begin + if (value < 2) + log2 = value; + else + begin + shifted = value-1; + for (res=0; shifted>0; res=res+1) + shifted = shifted>>1; + log2 = res; + end + end + endfunction + + localparam maxSIZE = `max(SIZEA, SIZEB); + localparam maxWIDTH = `max(WIDTHA, WIDTHB); + localparam minWIDTH = `min(WIDTHA, WIDTHB); + + localparam RATIO = maxWIDTH / minWIDTH; + localparam log2RATIO = log2(RATIO); + + reg [minWIDTH-1:0] RAM [0:maxSIZE-1]; + reg [WIDTHB-1:0] readB; + + always @(posedge clkA) + begin + if (enaA) begin + if (weA) + RAM[addrA] <= diA; + end + end + + always @(posedge clkB) + begin : ramread + integer i; + reg [log2RATIO-1:0] lsbaddr; + if (enaB) begin + for (i = 0; i < RATIO; i = i+1) begin + lsbaddr = i; + readB[(i+1)*minWIDTH-1 -: minWIDTH] <= RAM[{addrB, lsbaddr}]; + end + end + end + assign doB = readB; +endmodule
\ No newline at end of file |