mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Generate TRELLIS_DPR16X4 for lutram
This commit is contained in:
		
							parent
							
								
									6e12da3956
								
							
						
					
					
						commit
						6e4c1675e7
					
				
					 3 changed files with 72 additions and 21 deletions
				
			
		| 
						 | 
					@ -200,6 +200,50 @@ module DCMA (
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(* abc9_box, lib_whitebox *)
 | 
				
			||||||
 | 
					module TRELLIS_DPR16X4 (
 | 
				
			||||||
 | 
						input  [3:0] DI,
 | 
				
			||||||
 | 
						input  [3:0] WAD,
 | 
				
			||||||
 | 
						input        WRE,
 | 
				
			||||||
 | 
						input        WCK,
 | 
				
			||||||
 | 
						input  [3:0] RAD,
 | 
				
			||||||
 | 
						output [3:0] DO
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
						parameter WCKMUX = "WCK";
 | 
				
			||||||
 | 
						parameter WREMUX = "WRE";
 | 
				
			||||||
 | 
						parameter [63:0] INITVAL = 64'h0000000000000000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reg [3:0] mem[15:0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						integer i;
 | 
				
			||||||
 | 
						initial begin
 | 
				
			||||||
 | 
							for (i = 0; i < 16; i = i + 1)
 | 
				
			||||||
 | 
								mem[i] <= INITVAL[4*i +: 4];
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wire muxwck = (WCKMUX == "INV") ? ~WCK : WCK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reg muxwre;
 | 
				
			||||||
 | 
						always @(*)
 | 
				
			||||||
 | 
							case (WREMUX)
 | 
				
			||||||
 | 
								"1": muxwre = 1'b1;
 | 
				
			||||||
 | 
								"0": muxwre = 1'b0;
 | 
				
			||||||
 | 
								"INV": muxwre = ~WRE;
 | 
				
			||||||
 | 
								default: muxwre = WRE;
 | 
				
			||||||
 | 
							endcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						always @(posedge muxwck)
 | 
				
			||||||
 | 
							if (muxwre)
 | 
				
			||||||
 | 
								mem[WAD] <= DI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assign DO = mem[RAD];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						specify
 | 
				
			||||||
 | 
							// TODO
 | 
				
			||||||
 | 
							(RAD *> DO) = 0;
 | 
				
			||||||
 | 
						endspecify
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(* abc9_box, lib_whitebox *)
 | 
					(* abc9_box, lib_whitebox *)
 | 
				
			||||||
module DPR16X4C (
 | 
					module DPR16X4C (
 | 
				
			||||||
		input [3:0] DI,
 | 
							input [3:0] DI,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,11 @@
 | 
				
			||||||
ram distributed $__DPR16X4C_ {
 | 
					ram distributed $__TRELLIS_DPR16X4_ {
 | 
				
			||||||
	abits 4;
 | 
						abits 4;
 | 
				
			||||||
	width 4;
 | 
						width 4;
 | 
				
			||||||
	cost 4;
 | 
						cost 4;
 | 
				
			||||||
	init no_undef;
 | 
						init any;
 | 
				
			||||||
	prune_rom;
 | 
						prune_rom;
 | 
				
			||||||
	port sw "W" {
 | 
						port sw "W" {
 | 
				
			||||||
		clock posedge;
 | 
							clock anyedge;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	port ar "R" {
 | 
						port ar "R" {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,30 @@
 | 
				
			||||||
module $__DPR16X4C_ (...);
 | 
					module $__TRELLIS_DPR16X4_(...);
 | 
				
			||||||
	parameter INIT = 64'b0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	input PORT_W_CLK;
 | 
					parameter INIT = 64'bx;
 | 
				
			||||||
	input [3:0] PORT_W_ADDR;
 | 
					parameter PORT_W_CLK_POL = 1;
 | 
				
			||||||
	input [3:0] PORT_W_WR_DATA;
 | 
					 | 
				
			||||||
	input PORT_W_WR_EN;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	input [3:0] PORT_R_ADDR;
 | 
					input PORT_W_CLK;
 | 
				
			||||||
	output [3:0] PORT_R_RD_DATA;
 | 
					input [3:0] PORT_W_ADDR;
 | 
				
			||||||
 | 
					input [3:0] PORT_W_WR_DATA;
 | 
				
			||||||
 | 
					input PORT_W_WR_EN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	DPR16X4C #(
 | 
					input [3:0] PORT_R_ADDR;
 | 
				
			||||||
		.INITVAL($sformatf("0x%08x", INIT))
 | 
					output [3:0] PORT_R_RD_DATA;
 | 
				
			||||||
	) _TECHMAP_REPLACE_ (
 | 
					
 | 
				
			||||||
		.RAD(PORT_R_ADDR),
 | 
					localparam WCKMUX = PORT_W_CLK_POL ? "WCK" : "INV";
 | 
				
			||||||
		.DO(PORT_R_RD_DATA),
 | 
					
 | 
				
			||||||
 | 
					TRELLIS_DPR16X4 #(
 | 
				
			||||||
 | 
						.INITVAL(INIT),
 | 
				
			||||||
 | 
						.WCKMUX(WCKMUX),
 | 
				
			||||||
 | 
						.WREMUX("WRE")
 | 
				
			||||||
 | 
					) _TECHMAP_REPLACE_ (
 | 
				
			||||||
 | 
						.RAD(PORT_R_ADDR),
 | 
				
			||||||
 | 
						.DO(PORT_R_RD_DATA),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.WAD(PORT_W_ADDR),
 | 
				
			||||||
 | 
						.DI(PORT_W_WR_DATA),
 | 
				
			||||||
 | 
						.WCK(PORT_W_CLK),
 | 
				
			||||||
 | 
						.WRE(PORT_W_WR_EN)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		.WAD(PORT_W_ADDR),
 | 
					 | 
				
			||||||
		.DI(PORT_W_WR_DATA),
 | 
					 | 
				
			||||||
		.WCK(PORT_W_CLK),
 | 
					 | 
				
			||||||
		.WRE(PORT_W_WR_EN)
 | 
					 | 
				
			||||||
	);
 | 
					 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue