1 module \$__NX_PDP16K (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN);
2 parameter CFG_ABITS = 9;
3 parameter CFG_DBITS = 36;
4 parameter CFG_ENABLE_A = 4;
8 parameter [18431:0] INIT = 18432'b0;
10 parameter _TECHMAP_BITS_CONNMAP_ = 8;
11 parameter [_TECHMAP_BITS_CONNMAP_-1:0] _TECHMAP_CONNMAP_CLK2_ = 0;
12 parameter [_TECHMAP_BITS_CONNMAP_-1:0] _TECHMAP_CONNMAP_CLK3_ = 0;
17 input [CFG_ABITS-1:0] A1ADDR;
18 input [CFG_DBITS-1:0] A1DATA;
19 input [CFG_ENABLE_A-1:0] A1EN;
21 input [CFG_ABITS-1:0] B1ADDR;
22 output [CFG_DBITS-1:0] B1DATA;
25 // Address is left justified, in x18 and above lower bits are byte enables
27 (CFG_DBITS == 36) ? 5 :
28 (CFG_DBITS == 18) ? 4 :
29 (CFG_DBITS == 9) ? 3 :
30 (CFG_DBITS == 4) ? 2 :
31 (CFG_DBITS == 2) ? 1 :
34 // Different primitives needed for single vs dual clock case
35 localparam SINGLE_CLOCK = (_TECHMAP_CONNMAP_CLK2_ == _TECHMAP_CONNMAP_CLK3_);
37 localparam WIDTH = $sformatf("X%d", CFG_DBITS);
42 assign ra = {B1ADDR, {A_SHIFT{1'b1}}};
46 assign wa = {A1ADDR, {(A_SHIFT-CFG_ENABLE_A){1'b1}}, A1EN};
48 assign wa = {A1ADDR, {A_SHIFT{1'b1}}};
52 assign B1DATA = rd[CFG_DBITS-1:0];
60 INV wck_inv_i (.A(CLK2), .Z(wck));
64 INV wck_inv_i (.A(CLK3), .Z(rck));
69 localparam INIT_CHUNK_SIZE = (CFG_DBITS <= 4) ? 256 : 288;
71 function [319:0] permute_init;
72 input [INIT_CHUNK_SIZE-1:0] chunk;
75 if (CFG_DBITS <= 4) begin
76 for (i = 0; i < 32; i = i + 1'b1)
77 permute_init[i * 10 +: 10] = {2'b00, chunk[i * 8 +: 8]};
79 for (i = 0; i < 32; i = i + 1'b1)
80 permute_init[i * 10 +: 10] = {1'b0, chunk[i * 9 +: 9]};
86 if (SINGLE_CLOCK) begin
93 `include "brams_init.vh"
95 .CLK(wck), .RST(1'b0),
96 .DI(wd), .ADW(wa), .CEW(we), .CSW(3'b111),
97 .ADR(ra), .DO(rd), .CER(B1EN), .CSR(3'b111)
101 .DATA_WIDTH_W(WIDTH),
102 .DATA_WIDTH_R(WIDTH),
106 `include "brams_init.vh"
107 ) _TECHMAP_REPLACE_ (
108 .CLKW(wck), .CLKR(rck), .RST(1'b0),
109 .DI(wd), .ADW(wa), .CEW(we), .CSW(3'b111),
110 .ADR(ra), .DO(rd), .CER(B1EN), .CSR(3'b111)