module lineram #( parameter DATA_WIDTH = 36, parameter ADDR_WIDTH = 9 ) ( input [DATA_WIDTH - 1:0] din, input [ADDR_WIDTH - 1:0] addr_w, output reg [DATA_WIDTH - 1:0] dout, input [ADDR_WIDTH - 1:0] addr_r, input write_en, input read_clk, input write_clk ); // `ifdef YOSYS // // use the ECP5 primitive. // defparam ram.PORT_W_WR_EN_WIDTH = 1; // $__ECP5_PDPW16KD_ ram ( // .PORT_R_CLK(read_clk), // .PORT_R_ADDR(addr_r), // .PORT_R_RD_DATA(dout), // .PORT_W_CLK(write_clk), // .PORT_W_WRITE_EN(write_en), // .PORT_W_WR_DATA(din), // ); // // PDPW16KD ram ( // // .DI0 (din[0]), // // .DI1 (din[1]), // // .DI2 (din[2]), // // .DI3 (din[3]), // // .DI4 (din[4]), // // .DI5 (din[5]), // // .DI6 (din[6]), // // .DI7 (din[7]), // // .DI8 (din[8]), // // .DI9 (din[9]), // // .DI10(din[10]), // // .DI11(din[11]), // // .DI12(din[12]), // // .DI13(din[13]), // // .DI14(din[14]), // // .DI15(din[15]), // // .DI16(din[16]), // // .DI17(din[17]), // // .DI18(din[18]), // // .DI19(din[19]), // // .DI20(din[20]), // // .DI21(din[21]), // // .DI22(din[22]), // // .DI23(din[23]), // // .DI24(din[24]), // // .DI25(din[25]), // // .DI26(din[26]), // // .DI27(din[27]), // // .DI28(din[28]), // // .DI29(din[29]), // // .DI30(din[30]), // // .DI31(din[31]), // // .DI32(din[32]), // // .DI33(din[33]), // // .DI34(din[34]), // // .DI35(din[35]), // // .ADW0(addr_w[0]), // // .ADW1(addr_w[1]), // // .ADW2(addr_w[2]), // // .ADW3(addr_w[3]), // // .ADW4(addr_w[4]), // // .ADW5(addr_w[5]), // // .ADW6(addr_w[6]), // // .ADW7(addr_w[7]), // // .ADW8(addr_w[8]), // // // // ); // `else reg [DATA_WIDTH - 1:0] ram[2**ADDR_WIDTH]; `ifndef YOSYS initial begin for (int i = 0; i < 2 ** ADDR_WIDTH; i = i + 1) begin ram[i] = 0; end end `endif always @(posedge write_clk) begin if (write_en) ram[addr_w] <= din; end always @(posedge read_clk) begin dout <= ram[addr_r]; end // `endif endmodule