为什么Xilinx ISE不推断Block RAM?

时间:2016-11-02 22:27:07

标签: verilog fpga ram spartan

正如标题所示,ISE无法从我的代码中推断出Block RAM。

wire we;

reg hold = 0;
reg start = 0;

reg [12:0] addr = 0;
reg [23:0] command = 0;

reg [7:0] RAM [8191 : 0];

reg [7:0] rx_data_buffer = 0;

assign we = new_rx_data && !hold && start;

always@(posedge clk) begin

new_tx_data <= 1'b0;

if(!tx_busy && hold && !new_tx_data) begin

    new_tx_data <= 1'b1;        
    addr <= addr + 1'b1;

    tx_data_buffer <= RAM[addr];

    if(addr == 13'd8191)
        hold <= 0;

end

else if(new_rx_data && !hold) begin

    addr <= addr + 1'b1;
    command <= {command[15:0], rx_data};

    if(addr == 13'd8191)
        hold <= 1;

    if(start)
        led <= rx_data;

end

if(we)
    RAM[addr] <= rx_data;

if(command == 24'h242424) //$$$ in ASCII
    start <= 1;

end

我已经推断出问题的根源是我的RAM的写使能信号。如果我通过编写

将其设置为VCC
if(1'b1)
    RAM[addr] <= rx_data;

ISE推断RAM没有问题。但是,这不是我的预期行为。我希望写使能信号为

assign we = new_rx_data && !hold && start;

无论我分配给哪个寄存器&#34;我们&#34; ISE告诉我,它将推断分布式RAM。有没有人以前处理过这个问题?

1 个答案:

答案 0 :(得分:0)

您可能需要解决一些问题。我看到你正在使用new_rx_data来分配我们。我没有在你的RTL中看到它被分配。它漂浮了吗?还是输入?

Addr在IF和ELSEIF中分配。没有ELSE,所以在我看来这意味着它在某些条件下不会被分配。也许它只是保留了价值,但同样不是我喜欢这样做。

另一个是您使用非阻塞分配进行分配,并且可能两次分配相同的变量(请参阅new_tx_data),但我无法确定它将如何合成。如果它是不可合成的,我希望构建会崩溃,但它确实会构建,你可能会得到意想不到的结果。

话虽如此,您需要修复这些内容以确保模拟结果与实际结果相符。你是一个模拟器,他说奇怪的球分配是可以的,物理综合工具可以用不同的方式解决问题,这两个结果可能会有所不同。

所以,你需要做的第二件事是检查你的警告。综合工具会抱怨事情,它可能包含对您正在使用的某些信号的有害警告。如果您正在使用的其中一个信号(在您的分配我们的声明中检查这三个信号)被认为总是卡在高位或总是卡在低位,您可能有一个意味着您无法写入的状态,或者您无法阅读,或两者兼而有之。这将导致无法推断RAM。制作不能写的记忆没有意义吗?你总是会读零,所以我只是硬连接数据总线为零并完成它。