如何在 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
最近在玩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