Hello!
This thread is the most relevant to my problem.
I have a True Dual Port RAM with dual clocks inferred from Quartus II Verilog Template:
// Quartus II Verilog Template
// True Dual Port RAM with dual clocks
module true_dual_port_ram_dual_clock# (parameter DATA_WIDTH=8, parameter ADDR_WIDTH=5)
(
input data_a, data_b,
input addr_a, addr_b,
input we_a, we_b, clk_a, clk_b,
output reg q_a, q_b
);
// Declare the RAM variable
reg ram;
always @ (posedge clk_a)
begin
// Port A
if (we_a)
begin
ram <= data_a;
q_a <= data_a;
end
else
begin
q_a <= ram;
end
end
always @ (posedge clk_b)
begin
// Port B
if (we_b)
begin
ram <= data_b;
q_b <= data_b;
end
else
begin
q_b <= ram;
end
end
endmodule
To force Quartus to preserve this RAM as registers I added the following line in *.qsf file:
set_global_assignment -name AUTO_RAM_RECOGNITION OFF -entity true_dual_port_ram_dual_clock
I created a simple project to help You reconstruct the problem ( attached
http://www.alteraforum.com/forum/attachment.php?attachmentid=9460&stc=1 ) .
If Quartus compiles this RAM as a RAM, then there are no compilation errors, but if I force Quartus to keep this RAM as registers, then it gives out the following very confusing errors:
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10029): Constant driver at TrueDualPortDualClockRAM.v(16)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (10028): Can't resolve multiple constant drivers for net "ram" at TrueDualPortDualClockRAM.v(30)
Error (12152): Can't elaborate user hierarchy "true_dual_port_ram_dual_clock:inst"
Error: Result: ERROR: Error(s) found while running an executable. See report file(s) for error message(s). Message log indicates which executable was run last.
Error: Failed to discover source files from compiler. Check Analysis & Elaboration report.
What can be done as a workout to prevent Analysis & Synthesis from converting the registers into an altsyncram megafunction?
As You can see turning off the Auto RAM Replacement logic option for the entity or instance that contains the dual-clock RAM results in strange errors ...
P.S. All this was done according to the following Altera document:
http://quartushelp.altera.com/13.1/master.htm#mergedprojects/msgs/msgs/winfer_ram_functionality_change_altsyncram_dual_clock.htm