如何在 Verilog 中创建和使用任务

How do I create and use a Task in Verilog

最近在玩Arduino MKR Vidor 4000,遇到了一个小问题运行。 我希望能够重用代码(就像使用 C++ 中的函数一样)并将定义的变量本地化到代码段中,这样它们就不会交互。我在 Verilog 中遇到过任务,这些似乎是执行此操作的正确方法。

问题是,我无法让 Quartus 编译它。它只是报告一个错误:

Error (12006): Node instance "comb_6" instantiates undefined entity "test". Ensure that required library paths are specified correctly, define the specified entity, or change the instantiation. If this entity represents Intel FPGA or third-party IP, generate the synthesis files for the 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

根据我从评论中收集到的信息,我不应该在任务中使用任何 assign。而且我也应该只从 always/begin-end/initial 等内部调用任务。 如果我不能以这种方式使用任务,我应该怎么做才能创建可重用代码以制作可以综合的基本逻辑门?例如寄存器组

我已经将我希望能够重用的代码放在一个模块中,现在它可以正常工作了! 我不确定这是否是我应该做的,所以如果有人有更好的方法,那么我洗耳恭听!

我已经有效地做到了:

module test (input [3:0] in, output [3:0] out);
reg [3:0] temp;
assign temp[0] = in[0];
assign out[0] = temp[0];
endmodule

module main;
reg [7:0] bMKR_D;
test test1 (bMKR_D[4:1], bMKR_D[8:5]);
endmodule