2017-10-21 218 views
0

我有一个verilog文件,我想要的是一个数学任务,然后我在另一个文件中执行include "maths.v",然后在mathsfunction;中写入mathsfunction;在其他文件initial begin - end块,应该在这一点上运行的任务,如果我理解正确的话,代码如下:Verilog 2001语法中全局声明是非法的任务

Maths.v

task mathsfunction; 
reg [0:31] x; 
reg [0:31] y; 
reg [0:31] z; 
begin 
    x = $urandom; 
    y = $urandom; 
    z = x + y 
end 
#200  
endtask 

我得到一个编译错误,这是对第一行task mathsfunction;这是Global declarations are illegal in Verilog 2001 syntax.从我迄今为止学到的,有一个verilog文件只是一个任务(不是一个模块,我不希望它是一个模块)应该没问题?所以不知道为什么这不起作用。

任何帮助将是巨大的

+0

您需要提供更多信息。任务可以在全局空间中声明。所以,你的信息与别的东西有关。 – Serge

+0

我没有LRM在我面前,但我相信所有版本的Verilog都不支持在全局空间(即模块外部)声明信号,任务,函数或参数。我知道SystemVerilog的确如此,但这样做被认为是不好的做法。推荐的是定义共享的任务,功能等,是将它们放入SystemVerilog包中。 – Greg

回答

0

你的第一个问题是,你混淆Verilog2K(“Verilog的”)和SystemVerilog。在Verilog中,任务声明只能出现在模块内或生成(而不是“全局”),这会给出错误信息。其次,您的任务包含两个语句(begin/end seq块和时序控制),这在Verilog中无效; SV放松了这一点。话虽如此,将#200放在块外面没有任何用处,所以你可以将它移动到块内使其与Verilog兼容。

您的下一个问题是您的任务没有输入或输出 - x,y,z是内部的;你需要使它们成为input,outputinout

最后,您已经错误地剪切/粘贴 - 如果没有更多分号,此代码将无法编译。