【发布时间】:2020-10-15 16:01:11
【问题描述】:
我最近一直在玩 Arduino MKR Vidor 4000,但遇到了一个小问题。 我希望能够重用代码(就像使用 C++ 中的函数一样)并且将定义的变量定义为代码片段,因此它们不会交互。我在 Verilog 中遇到过 Tasks,这些似乎是正确的做法。
问题是,我无法让 Quartus 编译它。它只是报错:
错误 (12006):节点实例“comb_6”实例化未定义的实体 “测试”。确保正确指定所需的库路径、定义指定实体或更改实例化。如果该实体代表英特尔 FPGA 或第三方 IP,则为 IP 生成综合文件。
这是我的代码:
task automatic test(input [3:0] in, output [3:0] out);
reg [3:0] temp;
assign temp[0] = in[0];
assign out[0] = temp[0];
endtask
test(bMKR_D[4:1], bMKR_D[8:5]);
这包含在定义可用 MKR Vidor 引脚的文件中。
编辑:这是一个最小的可重现示例......我认为
module MKRVIDOR4000_top
(
// Input definitions available for the MKR Vidor 4000
);
// Other signal declarations
// My code
task automatic test(input [3:0] in, output [3:0] out);
reg [3:0] temp;
assign temp[0] = in[0];
assign out[0] = temp[0];
endtask
test(bMKR_D[4:1], bMKR_D[8:5]);
endmodule
根据我从 cmets 收集到的信息,我不应该在任务中使用任何 assigns。而且我也应该只从always/begin-end/initial 等内部调用任务。
如果我不能以这种方式使用任务,我应该怎么做才能创建可重用的代码以制作可以合成的基本逻辑门?例如注册银行
【问题讨论】:
-
在
module中使用assign,或者在function中使用begin-end。简单的function可以合成,浏览设计结构时不添加层次结构。 -
看起来错误消息告诉您正在尝试从顺序块(
task或initial或always或final)外部调用任务。但是,如果没有minimal reproducible example,则无法分辨。请包括一个。正如其他人所说,不要在任务中使用assign语句。这是合法的,但意味着一些奇怪的东西,我认为已被弃用。 -
@toolic 我正在尝试使用 Verilog 和 MKR Vidor 复制基本逻辑门以创建寄存器组。
-
@MatthewTaylor 就是这种情况,我查看了我的文件包含在哪里,它们在任何
always等块之外。我将编辑以包含它包含的文件,但它很长,因为它具有可用于 MKR Vidor 的所有引脚定义。我应该在这里添加它吗?还是放在粘贴箱之类的地方? -
A minimal reproducible example 不是您的全部代码。这个想法是您只包含相关代码。如果我对您的错误原因是正确的,那么 IP 是无关紧要的。我可以用 9 行代码重现您的错误 - edaplayground.com/x/ea72。