Verilog 生成实例化模块是否始终需要块来传播敏感度列表?
在编写Verilog代码时,我感到困惑,因为Verilog混合了always块、generate块和实例化。如果有人能在这方面帮助我,我将不胜感激 块A是一个模块,当rst信号被断言时,它将重置x。我测试了块_A,发现在断言rst信号时,x被重置为0。这很简单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:
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