硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2315|回复: 0
收起左侧

Verilog设计练习进阶(7)------- 在Verilog HDL 中使用任务(task)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2013-1-30 15:16:22 | 显示全部楼层 |阅读模式
       仅有函数并不能完全满足Veirlog HDL 中的运算需求。当我们希望能够将一些信号进行
运算并输出多个结果时,采用函数结构就显得非常不方便,而任务结构在这方面的优势则十
分突出。任务本身并不返回计算值,但是它通过类似C 语言中形参与实参的数据交换,非常
快捷地实现运算结果的调用。
此外,我们还常常利用任务来帮助我们实现结构化的模块设计,
将批量的操作以任务的形式独立出来,这样设计的目的通常一眼看过去就很明了。
         下面是一个利用 task 和电平敏感的 always 块设计比较后重组信号的组合逻辑的实例。
可以看到,利用 task 非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非
常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余
逻辑等问题。
module verilog_prj(ra,rb,rc,rd,a,b,c,d);
  output[3:0] ra,rb,rc,rd;
  input[3:0] a,b,c,d;
  reg[3:0] ra,rb,rc,rd;
  reg[3:0] va,vb,vc,vd;

  always @ (a or b or c or d)
    begin
       {va,vb,vc,vd}={a,b,c,d};
      sort2(va,vc);                //va 与 vc互换。
      sort2(vb,vd);                //vb 与 vd互换。
      sort2(va,vb);                //va 与 vb互换。
      sort2(vc,vd);                //vc 与 vd互换。
      sort2(vb,vc);                //vb 与 vc互换。
      {ra,rb,rc,rd}={va,vb,vc,vd};
    end
     
  task sort2;
    inout[3:0] x,y;
    reg[3:0] tmp;
    if(x>y)
      begin
        tmp=x;     //x 与y 变量的内容互换,要求顺序执行,所以采用阻塞赋值方式。
        x=y;
        y=tmp;
      end
  endtask
  endmodule
测试模块
`timescale 1 ns/ 1 ps
module verilog_prj_vlg_tst();
// constants                                          
// general purpose registers
reg eachvec;
// test vector input registers
reg [3:0] a;
reg [3:0] b;
reg [3:0] c;
reg [3:0] d;
// wires                                               
wire [3:0]  ra;
wire [3:0]  rb;
wire [3:0]  rc;
wire [3:0]  rd;
// assign statements (if any)                          
verilog_prj i1 (
// port map - connection between master ports and signals/registers   
    .a(a),
    .b(b),
    .c(c),
    .d(d),
    .ra(ra),
    .rb(rb),
    .rc(rc),
    .rd(rd)
);
initial
  begin
    a=0;b=0;c=0;d=0;
  repeat(5)
  begin  
      #100  a ={$random}%15;
            b ={$random}%15;   
            c ={$random}%15;
            d ={$random}%15;
  end
  #100 $stop;
end  
endmodule
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-29 22:45 , Processed in 0.187261 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表