【问题标题】:Why isn't Xilinx ISE inferring block RAM?为什么赛灵思 ISE 不推断块 RAM?
【发布时间】:2016-11-02 22:27:06
【问题描述】:

正如标题所示,ISE 无法从我的代码中推断块 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;

无论我为“我们”分配什么寄存器,ISE 都会告诉我它会推断分布式 RAM。有没有人处理过这个问题?

【问题讨论】:

    标签: verilog fpga ram spartan


    【解决方案1】:

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

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

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

    话虽如此,您需要修复这些问题,以确保您的模拟结果与真实结果相符。你是一个说奇数球分配没问题的模拟器和以不同方式解决问题的物理合成工具,这两个结果可能会不同。

    因此,您需要做的第二件事是检查您的警告。综合工具会抱怨一些事情,它可能包括关于您正在使用的某些信号的有害警告。如果您正在使用的信号之一(检查您的 assign we 语句中的这三个信号)据说总是卡在高电平或总是卡在低电平,那么您可能处于无法写入的状态,或者您可以' t 阅读,或两者兼而有之。这将导致无法推断 RAM。制作不可写的内存没有意义吗?你总是会读零,所以我会为你将数据总线硬连接到零并完成它。

    【讨论】:

    • 您好,谢谢您的回复。根据我对 Verilog 标准的记忆,在行为块的不同位置分配的信号将采用块中最后一个分配的值。综合和仿真工具等绝对支持这一点。未明确分配的信号也将保留其值。综合警告没有帮助,说我可能一直在使用异步读取。真正的问题是我使用相同的地址进行读写(不知道为什么)。为这些值使用不同的寄存器解决了这个问题。
    • 这不会推断出锁存器并可能导致 sim/synthesis 不匹配吗?他们按照我上面的做法只会在输入之前推断出带有与门的触发器。
    • 您可以安全地使用像 = 这样的阻塞分配来执行多个分配,以获得您期望的顺序解析顺序,但您不应该以这种方式使用非阻塞
    • 不知道这是否有帮助,但这里是另一个关于inferred latches 的问题的链接。里面也有一些关于使用阻塞分配和非阻塞分配的内容。
    • 我相信你有它倒退。在时钟行为块中使用时,阻塞分配更容易出现竞争条件。看一看:vlsiencyclopedia.com/2012/08/race-condition-in-verilog.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多