我为我的一些代码创建了一个测试平台,并随着时间的推移慢慢添加。 它对于一个文件来说真的太大了,所以我想将任务移到单独的文件中。
如何更改此内容:
tb.v
module tb
int data;
initial begin
do_this;
#10;
do_that;
#10;
do_this;
#10;
end
task do_this ();
begin
data = 10;
end
endtask
task do_that ();
begin
if (data==10) begin
data = 20;
end
else begin
data = 0;
end
end
endtask
endmodule
这样的事情:
tb.v
module tb
int data;
initial begin
do_this(data);
#10; data = 30; //<-- data is driven by the initial statement and the modules
#10; do_that(data); //<-- data is both an input and an output
#10;
end
endmodule
do_this.v
module do_this (inout reg data); //<-- this is clearly wrong, but gets the point across
begin
#5; //<-- can't use delay statement in a module like this.
data = 10;
end
endmodule
do_that.v
module do_that (inout reg data); //<-- this is clearly wrong, but gets the point across
begin
if (data==10) begin
data = 20;
end
else begin
data = 0;
end
end
endmodule
我尝试过使用`include,但是很容易忘记'数据'的修改方式和位置。
我目前正在尝试使用输入和输出的任务,但是做这样的事情似乎非常错误:
do_that(.data_in(data), .data_out(data));
有更好/正确的方法来做这样的事吗? (classes / packages / global variables?)
答案 0 :(得分:2)
您可以使用`include或using systemVerilog的包来实现这一点。您可以在包中定义任务或功能,并在多个模块之间共享它们。以下是包的示例:
package p;
function int do_this();
return 10;
endfunction
function int do_that(input int in);
if (in==10) return 20;
else return 0;
endfunction
endpackage
module top;
import p::*;
int data;
initial begin
data = do_this();
#10;
data = do_that(.in(data));
#10;
data = do_this();
#10;
end
endmodule
您可以定义多个包并将每个包定义放在单独的文件中。
在函数调用中使用参数名称实际上被认为是一种很好的编码实践。
此外,在任务/函数中使用全局变量通常不是一个好主意,并且会阻止数据封装。最好通过本地参数将所有内容传递给函数,以确保不会发生无意的更改。