【发布时间】:2016-02-05 12:52:40
【问题描述】:
我正在尝试编写一个 Verilog 模块,该模块在每个周期中迭代外部存储器的元素。我现在面临的问题是,在循环期间更改内存地址不会导致输入数据在同一个循环中发生更改。即:更改地址不会导致输入数据一次更改循环。我会用一些代码来说明问题:
module r(input rst, ..., output reg [MEMORY_ADDR_WIDTH-1:0] addr, input memory_value);
//...
always @(posedge clk) begin
//...
for(addr = 0; addr < MEMORY_SIZE; addr = addr+1) begin
if (memory_value) //...
// PROBLEM: changing addr in this loop doesn't cause memory_value to change
end
end
endmodule
这是我实例化模块的方式
module top;
reg mem[MEMORY_SIZE-1:0];
wire [MEMORY_ADD_WIDTH-1:0] addr;
//...
r r( rst, ..., addr, mem[addr]);
endmodule
我正在使用 Modelsim 来模拟设计。首先,这是预期的行为吗?如果这是常见的解决方法?
【问题讨论】:
-
“memory_value”是“r”模块的输入,因此“r”模块本身不会改变“memory_value”的值。那么,“在此循环中更改 addr 不会导致 memory_value 更改”是什么意思?
-
@KaranShah 作为 OP 指定他们正在与内存交谈,他们可能期望
memory_value在他们在addr上提供新值时发生变化(这没有发生;看我的回答)