微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于task调用问题

关于task调用问题

时间:10-02 整理:3721RD 点击:
打算实现冒泡排序算法 对10个8位数排序使用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中传递二维信号 而不是仅仅用单个变量来传

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top