我在编写Verilog时感到困惑,它涉及到始终阻塞,生成块和实例化的混合。感谢有人可以帮助我。
block_A 是一个模块,当第一个信号被置位时它将复位x。我测试了block_A,并在第一个信号被置位时看到x被重置为0。这简直太神奇了。
df = df.groupby('WASHING CONTAINER AGENT').size()[lambda x: x.index > 0.0]
但是,当我尝试使用generate块将多个 block_A 实例化到顶层模块时,我发现了一个非常奇怪的场景。 x [6]和x [7]没有被重置为0.我是以错误的方式做的吗?我应该创建另一个always_ff块并将此生成块放入其中吗?意思是,我们需要传播敏感性列表?将生成块放在现有的always_ff块下是不明智的,因为它是以循环方式生成的。
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
答案 0 :(得分:0)
首先:您的示例代码不正确。两者都有语法错误。如果您提供测试平台,它也会有所帮助,因此我们可以检查您的代码而无需自己编写代码。
我可以想象什么时候使用&#39;生成&#39;可能会令人困惑。
我能想到的最好的方法是,当你想反复地使用“生成”时,可以使用“生成”。硬件。 这可以是一个模块实例(就像在代码末尾那样)或者像赋值一样放置相同的逻辑:
wire [7:0] a,b,c [0:3];
generate
for (i=0; i<4; i=i+1)
assign a[i] = b[i] ^ c[i];
上面的例子表明,生成不需要一直使用它。
我已经把你的代码和模拟它,但我必须自己制作测试平台。我在结果中看不到任何X-es,但是我不得不大量修改你的代码以解决语法错误,因此我不得不在几个地方猜测应该是什么。
你的编码风格很不寻常。 block_A中的代码通常是:
always_ff @ (posedge clk, posedge rst)
begin : a_block
integer i,j;
if (rst)
for (i=0; i<4; i=i+1)
x[i] <= 0;
else
for (j=0; j<4; j=j+1)
x[j] <= x_[j]; // syntax error,there is no x_!
end
这消除了生成的需要 对for循环使用单独的索引变量只是很好的编码实践。
答案 1 :(得分:0)
看起来我正在寻找错误方向的解决方案。
&#39; X&#39; x [6]处的状态和x [7]是由数组
引起的input signed [N-1:0] w [15:0]
其中w是带有N个打包位的解包数组。
block_A #(.N(N)) my_block_A(.w(w[j+3:j]),.x(x[j+3:j]),.rst(rst),.clk(clk));
当w被定义为2D打包数组时,这将起作用。
解决方案:
input signed [15:0][N-1:0] w
logic signed [15:0][N+2:0] x