mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			148 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
module priority_memory (
 | 
						|
	clk, wren_a, rden_a, addr_a, wdata_a, rdata_a,
 | 
						|
	wren_b, rden_b, addr_b, wdata_b, rdata_b
 | 
						|
	);
 | 
						|
 | 
						|
	parameter ABITS = 12;
 | 
						|
	parameter WIDTH = 72;
 | 
						|
 | 
						|
	input clk;
 | 
						|
	input wren_a, rden_a, wren_b, rden_b;
 | 
						|
	input [ABITS-1:0] addr_a, addr_b;
 | 
						|
	input [WIDTH-1:0] wdata_a, wdata_b;
 | 
						|
	output reg [WIDTH-1:0] rdata_a, rdata_b;
 | 
						|
 | 
						|
	`ifdef USE_HUGE
 | 
						|
	(* ram_style = "huge" *)
 | 
						|
	`endif
 | 
						|
	reg [WIDTH-1:0] mem [0:2**ABITS-1];
 | 
						|
 | 
						|
	integer i;
 | 
						|
	initial begin
 | 
						|
		rdata_a <= 'h0;
 | 
						|
		rdata_b <= 'h0;
 | 
						|
	end
 | 
						|
 | 
						|
	`ifndef FLIP_PORTS
 | 
						|
	always @(posedge clk) begin
 | 
						|
		// A port
 | 
						|
		if (wren_a)
 | 
						|
			mem[addr_a] <= wdata_a;
 | 
						|
		else if (rden_a)
 | 
						|
			rdata_a <= mem[addr_a];
 | 
						|
 | 
						|
		// B port
 | 
						|
		if (wren_b)
 | 
						|
			mem[addr_b] <= wdata_b;
 | 
						|
		else if (rden_b)
 | 
						|
			if (wren_a && addr_a == addr_b)
 | 
						|
				rdata_b <= wdata_a;
 | 
						|
			else
 | 
						|
				rdata_b <= mem[addr_b];
 | 
						|
	end
 | 
						|
	`else // FLIP PORTS
 | 
						|
	always @(posedge clk) begin
 | 
						|
		// A port
 | 
						|
		if (wren_b)
 | 
						|
			mem[addr_b] <= wdata_b;
 | 
						|
		else if (rden_b)
 | 
						|
			rdata_b <= mem[addr_b];
 | 
						|
 | 
						|
		// B port
 | 
						|
		if (wren_a)
 | 
						|
			mem[addr_a] <= wdata_a;
 | 
						|
		else if (rden_a)
 | 
						|
			if (wren_b && addr_a == addr_b)
 | 
						|
				rdata_a <= wdata_b;
 | 
						|
			else
 | 
						|
				rdata_a <= mem[addr_a];
 | 
						|
	end
 | 
						|
	`endif
 | 
						|
endmodule
 | 
						|
 | 
						|
module sp_write_first (clk, wren_a, rden_a, addr_a, wdata_a, rdata_a);
 | 
						|
 | 
						|
	parameter ABITS = 12;
 | 
						|
	parameter WIDTH = 72;
 | 
						|
 | 
						|
	input clk;
 | 
						|
	input wren_a, rden_a;
 | 
						|
	input [ABITS-1:0] addr_a;
 | 
						|
	input [WIDTH-1:0] wdata_a;
 | 
						|
	output reg [WIDTH-1:0] rdata_a;
 | 
						|
 | 
						|
	(* ram_style = "huge" *)
 | 
						|
	reg [WIDTH-1:0] mem [0:2**ABITS-1];
 | 
						|
 | 
						|
	integer i;
 | 
						|
	initial begin
 | 
						|
		rdata_a <= 'h0;
 | 
						|
	end
 | 
						|
 | 
						|
	always @(posedge clk) begin
 | 
						|
		// A port
 | 
						|
		if (wren_a)
 | 
						|
			mem[addr_a] <= wdata_a;
 | 
						|
		if (rden_a)
 | 
						|
			if (wren_a)
 | 
						|
				rdata_a <= wdata_a;
 | 
						|
			else
 | 
						|
				rdata_a <= mem[addr_a];
 | 
						|
	end
 | 
						|
endmodule
 | 
						|
 | 
						|
module sp_read_first (clk, wren_a, rden_a, addr_a, wdata_a, rdata_a);
 | 
						|
 | 
						|
	parameter ABITS = 12;
 | 
						|
	parameter WIDTH = 72;
 | 
						|
 | 
						|
	input clk;
 | 
						|
	input wren_a, rden_a;
 | 
						|
	input [ABITS-1:0] addr_a;
 | 
						|
	input [WIDTH-1:0] wdata_a;
 | 
						|
	output reg [WIDTH-1:0] rdata_a;
 | 
						|
 | 
						|
	(* ram_style = "huge" *)
 | 
						|
	reg [WIDTH-1:0] mem [0:2**ABITS-1];
 | 
						|
 | 
						|
	integer i;
 | 
						|
	initial begin
 | 
						|
		rdata_a <= 'h0;
 | 
						|
	end
 | 
						|
 | 
						|
	always @(posedge clk) begin
 | 
						|
		// A port
 | 
						|
		if (wren_a)
 | 
						|
			mem[addr_a] <= wdata_a;
 | 
						|
		if (rden_a)
 | 
						|
			rdata_a <= mem[addr_a];
 | 
						|
	end
 | 
						|
endmodule
 | 
						|
 | 
						|
module sp_read_or_write (clk, wren_a, rden_a, addr_a, wdata_a, rdata_a);
 | 
						|
 | 
						|
	parameter ABITS = 11;
 | 
						|
	parameter WIDTH = 144;
 | 
						|
 | 
						|
	input clk;
 | 
						|
	input wren_a, rden_a;
 | 
						|
	input [ABITS-1:0] addr_a;
 | 
						|
	input [WIDTH-1:0] wdata_a;
 | 
						|
	output reg [WIDTH-1:0] rdata_a;
 | 
						|
 | 
						|
	(* ram_style = "huge" *)
 | 
						|
	reg [WIDTH-1:0] mem [0:2**ABITS-1];
 | 
						|
 | 
						|
	integer i;
 | 
						|
	initial begin
 | 
						|
		rdata_a <= 'h0;
 | 
						|
	end
 | 
						|
 | 
						|
	always @(posedge clk) begin
 | 
						|
		if (wren_a)
 | 
						|
			mem[addr_a] <= wdata_a;
 | 
						|
		else if (rden_a)
 | 
						|
			rdata_a <= mem[addr_a];
 | 
						|
	end
 | 
						|
 | 
						|
endmodule
 |