// true dual port RAM, sync
|
// true dual port RAM, sync
|
module vfifo_dual_port_ram_`TYPE
|
module vfifo_dual_port_ram_`TYPE
|
(
|
(
|
// A side
|
// A side
|
d_a,
|
d_a,
|
`ifdef DW
|
`ifdef DW
|
q_a,
|
q_a,
|
`endif
|
`endif
|
adr_a,
|
adr_a,
|
we_a,
|
we_a,
|
`ifdef DC
|
`ifdef DC
|
clk_a,
|
clk_a,
|
`endif
|
`endif
|
// B side
|
// B side
|
q_b,
|
q_b,
|
adr_b,
|
adr_b,
|
`ifdef DW
|
`ifdef DW
|
d_b,
|
d_b,
|
we_b,
|
we_b,
|
`endif
|
`endif
|
`ifdef DC
|
`ifdef DC
|
clk_b
|
clk_b
|
`else
|
`else
|
clk
|
clk
|
`endif
|
`endif
|
);
|
);
|
|
|
parameter DATA_WIDTH = 8;
|
parameter DATA_WIDTH = 8;
|
parameter ADDR_WIDTH = 9;
|
parameter ADDR_WIDTH = 9;
|
|
|
input [(DATA_WIDTH-1):0] d_a;
|
input [(DATA_WIDTH-1):0] d_a;
|
input [(ADDR_WIDTH-1):0] adr_a;
|
input [(ADDR_WIDTH-1):0] adr_a;
|
input [(ADDR_WIDTH-1):0] adr_b;
|
input [(ADDR_WIDTH-1):0] adr_b;
|
input we_a;
|
input we_a;
|
output [(DATA_WIDTH-1):0] q_b;
|
output [(DATA_WIDTH-1):0] q_b;
|
`ifdef DW
|
`ifdef DW
|
input [(DATA_WIDTH-1):0] d_b;
|
input [(DATA_WIDTH-1):0] d_b;
|
output reg [(DATA_WIDTH-1):0] q_a;
|
output reg [(DATA_WIDTH-1):0] q_a;
|
input we_b;
|
input we_b;
|
`endif
|
`endif
|
`ifdef DC
|
`ifdef DC
|
input clk_a, clk_b;
|
input clk_a, clk_b;
|
`else
|
`else
|
input clk;
|
input clk;
|
`endif
|
`endif
|
|
|
`ifndef DW
|
`ifndef DW
|
reg [(ADDR_WIDTH-1):0] adr_b_reg;
|
reg [(ADDR_WIDTH-1):0] adr_b_reg;
|
`else
|
`else
|
reg [(DATA_WIDTH-1):0] q_b;
|
reg [(DATA_WIDTH-1):0] q_b;
|
`endif
|
`endif
|
|
|
// Declare the RAM variable
|
// Declare the RAM variable
|
reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0] /*synthesis syn_ramstyle = "no_rw_check"*/;
|
reg [DATA_WIDTH-1:0] ram [2**ADDR_WIDTH-1:0] /*synthesis syn_ramstyle = "no_rw_check"*/;
|
|
|
`ifdef DC
|
`ifdef DC
|
always @ (posedge clk_a)
|
always @ (posedge clk_a)
|
`else
|
`else
|
always @ (posedge clk)
|
always @ (posedge clk)
|
`endif
|
`endif
|
`ifdef DW
|
`ifdef DW
|
begin // Port A
|
begin // Port A
|
|
q_a <= ram[adr_a];
|
if (we_a)
|
if (we_a)
|
begin
|
|
ram[adr_a] <= d_a;
|
ram[adr_a] <= d_a;
|
q_a <= d_a;
|
|
end
|
|
else
|
|
q_a <= ram[adr_a];
|
|
end
|
end
|
`else
|
`else
|
if (we_a)
|
if (we_a)
|
ram[adr_a] <= d_a;
|
ram[adr_a] <= d_a;
|
`endif
|
`endif
|
|
|
`ifdef DC
|
`ifdef DC
|
always @ (posedge clk_b)
|
always @ (posedge clk_b)
|
`else
|
`else
|
always @ (posedge clk)
|
always @ (posedge clk)
|
`endif
|
`endif
|
`ifdef DW
|
`ifdef DW
|
begin // Port b
|
begin // Port b
|
|
q_b <= ram[adr_b];
|
if (we_b)
|
if (we_b)
|
begin
|
|
ram[adr_b] <= d_b;
|
ram[adr_b] <= d_b;
|
q_b <= d_b;
|
|
end
|
|
else
|
|
q_b <= ram[adr_b];
|
|
end
|
end
|
`else // !`ifdef DW
|
`else // !`ifdef DW
|
adr_b_reg <= adr_b;
|
adr_b_reg <= adr_b;
|
|
|
assign q_b = ram[adr_b_reg];
|
assign q_b = ram[adr_b_reg];
|
`endif // !`ifdef DW
|
`endif // !`ifdef DW
|
|
|
endmodule // true_dual_port_ram_sync
|
endmodule // true_dual_port_ram_sync
|
|
|