Verilog 生成实例化模块是否始终需要块来传播敏感度列表?

Verilog 生成实例化模块是否始终需要块来传播敏感度列表?,verilog,system-verilog,Verilog,System Verilog,在编写Verilog代码时,我感到困惑,因为Verilog混合了always块、generate块和实例化。如果有人能在这方面帮助我,我将不胜感激 块A是一个模块,当rst信号被断言时,它将重置x。我测试了块_A,发现在断言rst信号时,x被重置为0。这很简单 module block_A #(parameter N=4) ( input clk, rst, input signed [N-1:0] w [3:0]; output logic signed [N+2:

在编写Verilog代码时,我感到困惑,因为Verilog混合了always块、generate块和实例化。如果有人能在这方面帮助我,我将不胜感激

块A是一个模块,当rst信号被断言时,它将重置x。我测试了块_A,发现在断言rst信号时,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
模块块A#(参数N=4)(
输入时钟,rst,
输入符号[N-1:0]w[3:0];
输出逻辑符号[N+2:0]x[3:0]
);
genvar i;
生成

对于(i=0;i首先:您的示例代码不正确。两者都有语法错误。如果您提供测试平台,我们可以检查您的代码,而无需自己编写测试平台,这也会有所帮助

我可以想象,何时使用“生成”可能会令人困惑

我能想到的最好办法是,当您想反复“放置”硬件时,使用generate。 这可以是一个模块实例(就像您在代码末尾所做的那样),也可以像赋值一样放置相同的逻辑:

wire [7:0] a,b,c [0:3];
generate
   for (i=0; i<4; i=i+1)
      assign a[i] = b[i] ^ c[i];
wire[7:0]a、b、c[0:3];
生成

因为(i=0;i看起来我在错误的方向上寻找解决方案

在X[6]和X[7]处出现“X”状态的原因是由于阵列

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被定义为二维压缩数组时,这将起作用

解决方案:

input signed [15:0][N-1:0] w
logic signed [15:0][N+2:0] x 

很抱歉,我只是展示了我的代码片段。我这边没有语法错误。这样做的原因是代码更长更复杂。不管怎样,我可以知道为什么我们不需要为块A生成代码吗?我们不是反复放置x吗?我有点困惑。你的代码没有太多错误。问题是由其他原因造成的er模型的一部分。很难从您的示例和缺少的波形中得出任何结论。您所说的看起来像是某个比赛的结果或clk中的故障。
clk
。此外,“x”本身也可能由于clk和rst之间的比赛而出现故障,并导致您提供的代码之外的问题。是的,我可能应该附加完整的代码,但它非常复杂,涉及很多子模块,这就是为什么我决定提供snippet。无论如何,我设法找到根,导致问题与未打包的数组相关。正确的方法应该是[15:0][N-1:0]w,而不是编写带签名的输入[N-1:0]w。这将解决“x”问题。顺便说一句,谢谢
block_A #(.N(N)) my_block_A(.w(w[j+3:j]),.x(x[j+3:j]),.rst(rst),.clk(clk));
input signed [15:0][N-1:0] w
logic signed [15:0][N+2:0] x