在Verilog中使用任务task
- 1,任务目的
- 2,RTL代码,交换
- 3,测试代码
- 4,波形显示
1,任务目的
(1)掌握任务在verilog模块设计中的应用;
(2)学会在电平敏感列表的always中使用拼接操作、任务和阻塞赋值等语句,并生成复杂组合逻辑的高级方法。
当我们希望能够将一些信号进行运算并输出多个结果时,采用函数结构就显得很不方便,但是采用任务结构在这方面优势则十分突出。任务本身并不返回计算值,但它通过类似c语言中的形参和实参的数据交换,非常容易地实现运算结果的调用。
此外,还常利用任务来包装模块设计中的许多复杂任务的过程,将许多复杂的操作步骤用一个命名清晰易懂的任务隐藏起来,大大提高程序的可读性。
2,RTL代码,交换
// 在verilog中 使用任务 task
module sort4(
ra, rb, rc, rd,
a, b, c, d
);input [3:0] a, b, c, d;
output 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};
endtask sort2;
inout [3:0] x, y;
reg [3:0] tmp;if(x > y) begintmp = x; // x与y变量的内容互换,要求顺序执行,则采用阻塞赋值方式x = y;y = tmp;end
endtaskendmodule
3,测试代码
// 测试代码
module sort4_top;
reg [3:0] a, b, c, d;
wire [3:0] ra, rb, rc, rd;initial begina = 0; b = 0; c = 0; d = 0;repeat(50)
begin
#100 a = {$random}%15;b = {$random}%15;c = {$random}%15;d = {$random}%15;
end#100 $stop;
endsort4 u_sort4(
.a (a),
.b (b),
.c (c),
.d (d),
.ra (ra),
.rb (rb),
.rc (rc),
.rd (rd)
);endmodule