verilog 中的task语句使用注意情况

本文档详细描述了一个代码任务的修改过程,原任务中使用了小于等于运算符,导致出现不定态。通过将条件判断中的'<='改为'=',解决了这个问题。测试用例和波形显示了修改后的代码运行结果,确保任务按预期输出脉冲信号。
摘要由CSDN通过智能技术生成

这里我们定义一个任务,并对其进行测试。具体代码如下:

module task_test(
 input sys_clk,
 input rst_n,
 input [31:0]cntA,
 input [31:0]cntB
);

reg  r_pluse_out1;  
reg  r_pluse_out2;  
reg  r_pluse_out3;  
reg  r_pluse_out4;  
    
 always @(*)   begin
 if(!rst_n)begin
 r_pluse_out1<=1'b0;  
 r_pluse_out2<=1'b0;  
 r_pluse_out3<=1'b0;  
 r_pluse_out4<=1'b0;end
 else
 PLUSE_OUT(cntA,cntB,r_pluse_out1,r_pluse_out2,r_pluse_out3,r_pluse_out4);
 end
  
  
  //定义任务  
    task  PLUSE_OUT;
    input [31:0]count;
    input [31:0]R_conut;
    output pluse_out1;
    output pluse_out2;
    output pluse_out3;
    output pluse_out4;    
begin 
    if(count<=R_conut)
     begin
         pluse_out1<=1'b1;
         pluse_out2<=1'b0;
         pluse_out3<=1'b0;
         pluse_out4<=1'b0;
      end
     else if ((count>R_conut)&(count<=R_conut*2))
     begin
         pluse_out1<=1'b0;
         pluse_out2<=1'b1;
         pluse_out3<=1'b0;
         pluse_out4<=1'b0;
      end
    else if ((count>R_conut*2)&(count<=R_conut*3))
     begin
         pluse_out1<=1'b0;
         pluse_out2<=1'b0;
         pluse_out3<=1'b1;
         pluse_out4<=1'b0;
      end
    else if ((count>R_conut*3)&(count<=R_conut*4))
     begin
         pluse_out1<=1'b0;
         pluse_out2<=1'b0;
         pluse_out3<=1'b0;
         pluse_out4<=1'b1;
      end
    else
     begin
        pluse_out1<=1'b0;
        pluse_out2<=1'b0;
        pluse_out3<=1'b0;
        pluse_out4<=1'b0;
     end
 end
 endtask
 
endmodule

代码中定义了任务,实现根据条件依次输出四路脉冲。

testbench如下:

module testbench();
reg sys_clk;
reg rst_n;
reg [31:0]cntA;
reg [31:0]cntB;
 task_test u_task_test(
.sys_clk(sys_clk),
.rst_n(rst_n),
.cntA(cntA),
.cntB(cntB));


initial  sys_clk=10;
always #10 sys_clk=~sys_clk;
    
initial begin
    rst_n=0;
    cntA=0;
    cntB=0;
    #100
    rst_n=1;
    cntB=100;
    #100
   repeat(10000)
   begin
    #20
    cntA=cntA+1;
   end
   #10000
  $stop;
end
      
endmodule

仿真波形如下:

这里出现了不定态,

返回修改代码,将task 定义中的"<="改成“=”再仿真

 task  PLUSE_OUT;
    input [31:0]count;
    input [31:0]R_conut;
    output pluse_out1;
    output pluse_out2;
    output pluse_out3;
    output pluse_out4;    
begin 
    if(count<=R_conut)
     begin
         pluse_out1=1'b1;
         pluse_out2=1'b0;
         pluse_out3=1'b0;
         pluse_out4=1'b0;
      end
     else if ((count>R_conut)&(count<=R_conut*2))
     begin
         pluse_out1=1'b0;
         pluse_out2=1'b1;
         pluse_out3=1'b0;
         pluse_out4=1'b0;
      end
    else if ((count>R_conut*2)&(count<=R_conut*3))
     begin
         pluse_out1=1'b0;
         pluse_out2=1'b0;
         pluse_out3=1'b1;
         pluse_out4=1'b0;
      end
    else if ((count>R_conut*3)&(count<=R_conut*4))
     begin
         pluse_out1=1'b0;
         pluse_out2=1'b0;
         pluse_out3=1'b0;
         pluse_out4=1'b1;
      end
    else
     begin
        pluse_out1=1'b0;
        pluse_out2=1'b0;
        pluse_out3=1'b0;
        pluse_out4=1'b0;
     end
 end
 endtask

不定状态消失:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值