在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8040|回复: 8

[求助] 关于task调用问题

[复制链接]
发表于 2012-9-30 11:24:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
打算实现冒泡排序算法 对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正确? 感激不尽
发表于 2012-9-30 11:57:16 | 显示全部楼层
调用方法不对吧,a是一个二维的向量,但是你的in却是一维的。,,楼下给予详细解释!
发表于 2012-9-30 20:43:05 | 显示全部楼层
楼上的说完了,楼下有要补充的没?
发表于 2012-9-30 21:26:42 | 显示全部楼层
楼主这个问题比较多啊……
task的参数用inout的我还真没见过,估计就是因为你的inout有问题。
此外,tempa和tempb的位宽也要定义为[7:0]哦。
此外,交换a[j]和a[j+1]只需要{a[j],a[j+1]}={a[j+1],a[j]};一句话就行了,不用中间变量也可以。
此外,楼主要做这样的算法的话,感觉用个function会更讨巧。
发表于 2012-9-30 22:34:07 | 显示全部楼层
0:9是错的。改成9:0
task里面没有时序,可以改成function,function可以return一个结果。
inout可能确实有点问题。没有用过,不知道。
发表于 2012-10-1 10:33:17 | 显示全部楼层
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
就行了
 楼主| 发表于 2012-10-2 16:54:41 | 显示全部楼层
回复 6# eebinqiu


这样写的话代码就不怎么通用了
问题就在于如果在task中传递二维信号 而不是仅仅用单个变量来传
发表于 2018-11-28 18:25:02 | 显示全部楼层
学习中。。。。。。。。。。
发表于 2019-5-21 10:52:01 | 显示全部楼层
task例化的时候,不用列出端口信号表嘛?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-7-15 18:27 , Processed in 0.025542 second(s), 10 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表