【发布时间】:2018-04-21 10:10:58
【问题描述】:
我在编写 Verilog 时感到困惑,因为 Verilog 涉及始终块、生成块和实例化的混合。感谢是否有人可以帮助我。
block_A 是一个模块,它会在第一个信号被断言时重置 x。我测试了 block_A 并看到当第一个信号被断言时 x 被重置为 0。这很简单。
module block_A #(parameter N=4) (
input clk, rst,
input signed [N-1:0] w [3:0];
output logic signed [N+2:0] x [3:0]
);
genvar i;
generate
for (i=0; i<=3; i=i+1) begin
always_ff @ (posedge clk, posedge rst) begin
if (rst) x[i] <= 0;
else x[i] <= x_[i];
end
end
endgenerate
但是,当我尝试使用生成块将多个 block_A 实例化到顶部模块中时,我观察到了一个非常奇怪的场景。 x[6] 和 x[7] 没有被重置为 0。我做错了吗?我应该创建另一个 always_ff 块并将这个 generate 块放在里面吗?意思是,我们需要传播敏感度列表?将 generate 块放在现有的 always_ff 块下看起来不太明智,因为它是以循环方式生成的。
module top #(parameter N=4) (
input clk, rst,
input signed [N-1:0] w [15:0],
output logic signed [N+5:0] y [15:0]
};
logic signed [N+2:0] x [15:0];
genvar i;
generate
for (i=0; i<=15; i=i+1) begin: pipeline_y
always_ff @ (posedge clk, posedge rst) begin
if (rst) y[i] <= 0;
else y[i] <= y_[i];
end
end
endgenerate
genvar j;
generate
for (j=0; j<=15; j=j+4) begin: my_block
block_A #(.N(N)) my_block_A(.w(w[j+3:j]),.x(x[j+3:j]),.rst(rst),.clk(clk));
end
endgenerate
【问题讨论】:
-
您的代码没有太大问题。该问题是由模型的其他部分引起的。很难从您的示例和缺少的波形中得出任何结论。你所说的看起来像是某种种族或
clk中的故障的结果。由于 clk 和 rst 之间的竞争,“x”本身也可能出现故障,并导致您提供的代码片段之外的问题。 -
是的,也许我应该附上完整的代码,但它非常复杂并且涉及很多子模块,这就是我决定提供 sn-p 的原因。无论如何,我设法从根本上导致问题与解压数组有关。而不是写input signed [N-1:0] w [15:0],正确的方式应该是[15:0][N-1:0] w。这将解决“x”问题。谢谢顺便说一句