verilog task

1.形式

任务定义的形式如下:

task task_id;
    [declaration]
    procedural_statement
endtask

1 定义
有下列六点需要注意:
(1)在第一行“task”语句中不能列出端口名称;
(2)任务的输入、输出端口和双向端口数量不受限制,甚至可以没有输入、输出以及双向端口。
(3)在任务定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁的就是延迟控制语句) ,但这样会造成该任务不可综合。 可以在testbench中使用
(4)在任务中可以调用其他的任务或函数,也可以调用自身。
(5)在任务定义结构内不能出现 initial和 always过程块。
(6)在任务定义中可以出现“disable 中止语句” ,将中断正在执行的任务,但其是不可综合的。当任务被中断后,程序流程将返回到调用任务的地方继续向下执行。
2.任务调用
(1) 任务调用语句只能出现在过程块内; 虽然任务中不能出现 initial 语句和 always 语句语句, 但任务调用语句可以在 initial 语句和 always 语句中使用,

(2) 任务调用语句中,参数列表的顺序必须与任务定义中的端口声明顺序相同。
当被调用输入、输出或双向端口时,任务调用语句必须包含端口名列表,且信号端口顺序和类型必须和任务定义结构中的顺序和类型一致。需要说明的是,任务的输出端口必须和寄存器类型的数据变量对应。

其语法形式如下: task_id[(端口1, 端口 2, …, 端口 N)]; 其中 task_id是要调用的任务名,端口 1、端口 2,…是参数列表。参数列表给出传入任务的数据(进入任务的输入端)和接收返回结果的变量(从任务的输出端接收返回结果) 。

(3)任务调用语句是过程性语句,所以任务调用中接收返回数据的变量必须是寄存器类型

(4)可综合任务只能实现组合逻辑,也就是说调用可综合任务的时间为“0” 。而在面向仿真的任务中可以带有时序控制,如时延,因此面向仿真的任务的调用时间不为“0” 。

eg 四位全加器

module full_adder(A,B,CIN,S,COUT);
input[3:0] A;
input[3:0] B;
input CIN;
output[3:0] S;
output COUT;
reg[3:0] S0,S1,S2,S3;
 
task ADD;
 
input A;
input B;
input CIN;
output[1:0] SUM;
 
 
 
reg S;
reg COUT;
 
begin
 S=A^B^CIN;
 COUT=(A&B)|(A&CIN)|(B&CIN);
 SUM={COUT,S};
end
 
endtask
 
always@(*) //A or B or CIN
begin
ADD(A[0],B[0],CIN,S0);
ADD(A[1],B[1],S0[1],S1);
ADD(A[2],B[2],S1[1],S2);
ADD(A[3],B[3],S2[1],S3);
end
 assign S={S3[0],S2[0],S1[0],S0[0]};
 assign COUT=S3[1];
 
 
endmodule

function实现

module full_adder_4(A,B,CIN,S,COUT);
 
input[3:0] A;
input[3:0] B;
input CIN;
output[3:0] S;
output COUT;
wire[3:0] S0,S1,S2,S3;
 
function signed[1:0] ADD;
//port declaration
 input A;
 input B;
 input CIN;
//internal node signals declaration
 reg S,COUT;
 
 begin
 S=A^B^CIN;
 COUT=(A&B)|(A&CIN)|(B&CIN);
 ADD={COUT,S};
 end
 
 endfunction
 
 assign S0=ADD(A[0],B[0],CIN);   //第一位求和
 assign S1=ADD(A[1],B[1],S0[1]); //第二位求和
 assign S2=ADD(A[2],B[2],S1[1]); //第三位求和
 assign S3=ADD(A[3],B[3],S2[1]); //第三位求和
 
 assign S={S3[0],S2[0],S1[0],S0[0]};
 assign COUT=S3[1];
 
 endmodule 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值