eric2013 发表于 2013-1-30 15:15:49

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

       仅有函数并不能完全满足Veirlog HDL 中的运算需求。当我们希望能够将一些信号进行
运算并输出多个结果时,采用函数结构就显得非常不方便,而任务结构在这方面的优势则十
分突出。任务本身并不返回计算值,但是它通过类似C 语言中形参与实参的数据交换,非常
快捷地实现运算结果的调用。此外,我们还常常利用任务来帮助我们实现结构化的模块设计,
将批量的操作以任务的形式独立出来,这样设计的目的通常一眼看过去就很明了。
         下面是一个利用 task 和电平敏感的 always 块设计比较后重组信号的组合逻辑的实例。
可以看到,利用 task 非常方便地实现了数据之间的交换,如果要用函数实现相同的功能是非
常复杂的;另外,task也避免了直接用一般语句来描述所引起的不易理解和综合时产生冗余
逻辑等问题。
module verilog_prj(ra,rb,rc,rd,a,b,c,d);
output ra,rb,rc,rd;
input a,b,c,d;
reg ra,rb,rc,rd;
reg 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 x,y;
    reg 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 a;
reg b;
reg c;
reg d;
// wires                                             
wire ra;
wire rb;
wire rc;
wire 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
      #100a ={$random}%15;
            b ={$random}%15;   
            c ={$random}%15;
            d ={$random}%15;
end
#100 $stop;
end
endmodule

eric2013 发表于 2013-1-30 15:25:29


页: [1]
查看完整版本: Verilog设计练习进阶(7)------- 在Verilog HDL 中使用任务(task)