我有一个SystemVerilog模块 mFunc ,描述如下:
module mFunc #(parameter N = 1, parameter W=1)
(input logic signed [W:0] x[N],
output logic signed [W:0] Cx[N]);
always_comb
for(int k=0; k<N; k++)
Cx[k] = N-x[k];
endmodule: mFunc
和 mFunc2 模块调用 mFunc :
module mFunc2 #(parameter N = 1, parameter W=1)
(input logic signed [W:0] x[N][N],
output logic signed [W:0] Cx[N][N]);
logic signed [W:0] x_rows[N];
logic signed [W:0] C_rows[N];
mFunc #(.N(N), .W(W)) mFunc_rows(.x(x_rows), .Cx(C_rows));
always_comb begin
for(int k=0; k<N; k++) begin
for(int j=0; j<N; j++)begin
x_rows[j] = x[k][j];
Cx[k][j] = C_rows[j];
end
end
end
endmodule: mFunc2
当我运行模拟时,模块的行为如图1所示, mFunc 的输出( C_rows )未正确存储在 Cx中,只保存 C_rows 的最后一个值,如图1所示。
请有人帮我解决这个问题吗?
Figure 1: Statement of the problem
中模拟的链接谢谢。
答案 0 :(得分:0)
您只看到填充整个矩阵的最后一行的原因是您实现mFunc2
模块的方式。在其中,您有一个组合逻辑,其中包含一个for循环,将Cx[k]
分配给C_rows
,转换为x_rows
分配给x[N-1]
。然后,mFunc
模块中的逻辑可以将x_rows
转换为C_rows
行x[N-1]
。最后,mFunc2
中的组合逻辑再次运行,将Cx
的所有行分配给C_rows
。
从综合预测中考虑它,您只是实例化一个mFunc
模块,这意味着将行从x
转换为Cx
的逻辑仅存在于单个N
行。由于您没有时钟或其他同步机制,因此无法将单行馈送到模块中并获取其结果,然后在尝试使用for循环时输入下一行。要使设计以组合方式工作,您必须在设计中创建足够的资源来完成任务。在这种情况下,这意味着拥有N
(因为有mFunc
行)mFunc
个模块,每行一个。否则,您可以在N
周期的mFunc2
周期内将时钟和Feed一行引入mFunc
。
纯粹的组合路径相对容易,因为你需要对generate
模块做的所有事情都要在其中实例化更多module mFunc2 #(parameter N = 1, parameter W=1)
(input logic signed [W:0] x[N][N],
output logic signed [W:0] Cx[N][N]);
// Here, we make use of arrays of modules to make N instantiations of mFunc
// Note the [N] next to the mFunc_rows, meaning we are declaring an array
// of mFunc modules, ie N of them. These can be hooked up to the unpacked
// arrays x and Cx directly and will produce the desired output in Cx
mFunc #(.N(N), .W(W)) mFunc_rows[N](.x(x), .Cx(Cx));
endmodule: mFunc2
。您可以使用W
循环执行此操作,或者您可以使用适合您的情况的数组模块:
x
快速注意,如果您希望Cx
为logic signed [W-1:0]
和logic signed [W:0]
中值的位宽,则需要将它们声明为W+1
而不是[7:0]
{1}}后者将生成长度为[8:0]
的变量。例如,一个字节为android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
,而不是$("option").data(name);
,因为它有8位。