Verilog - 从外部存储器获得即时响应
Verilog - Getting immediate response from external memory
我正在尝试编写一个 Verilog 模块,它在 每个周期 中迭代外部存储器的元素。我现在面临的问题是,在循环期间更改内存地址不会导致输入数据发生更改,同样 cycle.i.e: 更改地址不会导致输入数据更改在一个 cycle.I 中更改将用一些代码说明问题:
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 来模拟设计。首先,这是预期的行为吗?如果是,常见的解决方法是什么?
Verilog 中的 for
循环用于创建分配的多个副本。循环自动展开(这就是它需要常量边界的原因)。
例如
always@(posedge clk)
for (i=1; i<4; i=i+1)
foo[i] <= foo[i-1]*foo[i-1];
相当于
always@(posedge clk) begin
foo[1] <= foo[0]*foo[0];
foo[2] <= foo[1]*foo[1];
foo[3] <= foo[2]*foo[2];
end
因此,您提供的代码从未为 addr
赋值,这可能是您看不到任何更改的原因。 (以同样的方式 i
没有出现在我的例子的第二部分)
考虑将它们分开。:
always@(posedge clk)
addr<=(addr+1)%ADDR_MAX;
always@(*)begin
if (memory_value) // mem[addr]
//...
end
我正在尝试编写一个 Verilog 模块,它在 每个周期 中迭代外部存储器的元素。我现在面临的问题是,在循环期间更改内存地址不会导致输入数据发生更改,同样 cycle.i.e: 更改地址不会导致输入数据更改在一个 cycle.I 中更改将用一些代码说明问题:
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 来模拟设计。首先,这是预期的行为吗?如果是,常见的解决方法是什么?
for
循环用于创建分配的多个副本。循环自动展开(这就是它需要常量边界的原因)。
例如
always@(posedge clk)
for (i=1; i<4; i=i+1)
foo[i] <= foo[i-1]*foo[i-1];
相当于
always@(posedge clk) begin
foo[1] <= foo[0]*foo[0];
foo[2] <= foo[1]*foo[1];
foo[3] <= foo[2]*foo[2];
end
因此,您提供的代码从未为 addr
赋值,这可能是您看不到任何更改的原因。 (以同样的方式 i
没有出现在我的例子的第二部分)
考虑将它们分开。:
always@(posedge clk)
addr<=(addr+1)%ADDR_MAX;
always@(*)begin
if (memory_value) // mem[addr]
//...
end