生成实例化模块是否需要传播敏感性列表?

时间:2018-04-21 10:10:58

标签: verilog system-verilog

我在编写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

2 个答案:

答案 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