【发布时间】:2017-08-08 16:38:50
【问题描述】:
我偶然发现了一些代码,这些代码似乎是完全正常的 verilog 风格,但对我来说看起来相当危险(我是 Verilog 的新手)。它总是关于并发的总是块和/或分配。这是一个例子:
module some(input clk_i);
..
module ram(
input wire a_clk,
input wire a_wr,
input wire [ADDR-1:0] a_addr,
input wire [DATA-1:0] a_din,
output reg [DATA-1:0] a_dout,
);
reg [DATA-1:0] mem [(2**ADDR)-1:0];
always @(posedge a_clk) begin
a_dout <= mem[a_addr];
if(a_wr) begin
a_dout <= a_din;
mem[a_addr] <= a_din;
end
end
endmodule
..
reg wrmem=1'b0;
reg[ADDR-1:0] memaddr;
reg[DATA-1:0] d_in;
ram mem(.a_clk(clk_i),.a_wr(wrmem),.a_addr(memaddr),.a_din(d_in),.a_dout(memout));
..
always @(posedge clk_i) begin
wrmem <= 1'b0;
...
if(..) begin
d_in <= sth.
memaddr <= some address
wrmem <= 1b'1;
end
end
endmodule;
所以这里我们有两个并发的always-blocks。第一个(在模块“ram”中)对时钟和“reg a_wr”为高做出反应。在第二个中,这个 'reg' 设置为 0 并在几步之后再次设置为 1。为什么这不会导致模块“ram”的任意行为(因为第一个块不会等到第二个块完成)?
【问题讨论】:
-
在第二个中,这个“reg”设置为 0,几步之后又设置为 1 - 在哪里?我看到两个不同的名字
wrmem和wrem。无论如何,看起来像 stackoverflow.com/questions/15718192/… 的副本 -
抱歉打错了
标签: concurrency verilog fpga vivado