关于task调用问题
如下:
task maopao;
inout [7:0] a[0:9];//10个数 每个8位
integer i,j;
reg tempa,tempb;
begin
for(i=0;i<=8;i=i+1)
for(j=0;j<8-i;j=j+1)
if(a[j]>a[j+1])
begin
tempa=a[j];
tempb=a[j+1];
a[j]=tempb;
a[j+1]=tempa;
end
end
endtask
然后我打算调用这个task
·timescale 1ns/1ns
module top;
reg [7:0] in[0:9];
integer i;
initial
begin
for(i=0;i<=9;i=i+1) //初始化存储单元
in=10-i;
#100
maopao(in[0:9]); // 100ns之后调用冒泡算法 这就是第12行
end
endmodule
然后编译不通过
# ** Error: C:/programmes/verilog/maopao2/maopao.v(12): (vlog-2110) Illegal reference to memory "a".
# ** Error: C:/programmes/verilog/maopao2/maopao.v(12): (vlog-2110) Illegal reference to memory "in".
# ** Error: C:/programmes/verilog/maopao2/maopao.v(12): Illegal array access into "in"
# ** Error: C:/programmes/verilog/maopao2/maopao.v(12): Illegal task output argument.
求指教 怎么才能调用task正确? 感激不尽
调用方法不对吧,a是一个二维的向量,但是你的in却是一维的。,,楼下给予详细解释!
楼上的说完了,楼下有要补充的没?
小编这个问题比较多啊……
task的参数用inout的我还真没见过,估计就是因为你的inout有问题。
此外,tempa和tempb的位宽也要定义为[7:0]哦。
此外,交换a[j]和a[j+1]只需要{a[j],a[j+1]}={a[j+1],a[j]};一句话就行了,不用中间变量也可以。
此外,小编要做这样的算法的话,感觉用个function会更讨巧。
0:9是错的。改成9:0
task里面没有时序,可以改成function,function可以return一个结果。
inout可能确实有点问题。没有用过,不知道。
task不必传参数,直接就可以使用in这个变量
reg tempa,tempb;应该为reg[7:0] tempa,tempb;
for(i=0;i<=8;i=i+1)for(j=0;j<9-i;j=j+1)应该为for(i=0;i<=9;i=i+1)for(j=0;j<9-i;j=j+1)
改成这样
//然后我打算调用这个task
`timescale 1ns/1ns
module top;
reg [7:0] in[0:9];
integer i;
task maopao;
integer i,j;
reg[7:0] tempa,tempb;
begin
for(i=0;i<=9;i=i+1)
for(j=0;j<9-i;j=j+1)
if(in[j]>in[j+1])
begin
tempa=in[j];
tempb=in[j+1];
in[j]=tempb;
in[j+1]=tempa;
end
end
endtask
initial
begin
for(i=0;i<=9;i=i+1) //初始化存储单元
in[i]=10-i;
#100
maopao;
end
endmodule
就行了
这样写的话代码就不怎么通用了
问题就在于如果在task中传递二维信号 而不是仅仅用单个变量来传
