在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 344|回复: 0

[原创] 承接上个帖子,求问verilog中task用非阻塞赋值与阻塞赋值的区别

[复制链接]
发表于 2024-6-16 18:58:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
还有下面这个例子
我写了一个呼吸灯:

`define   PERIOD     10
`define   TIME    2

module breath_led
(
    input   clk     ,
    input   rst_n   ,
    output  reg   led  
);

    reg   [29:0]cnt    ;
    reg   [29:0]phase    ;
    reg   status_flag  ;
    reg   stage  ;   

    always @ (posedge  clk  or  negedge  rst_n)  begin
        if ( !rst_n ) begin
            cnt<=0;
            phase<=0;
            status_flag<=0;
            led<=0;
            stage<=0;

        end

        else begin
            if ( status_flag==0 ) begin
                if ( cnt>=0 && cnt<=`PERIOD-phase-1) begin
                    led<=0;
                end
                else if ( cnt>=`PERIOD-phase && cnt<=`PERIOD-1 ) begin
                    led<=1;
                end

                if ( cnt>=0 && cnt<=`PERIOD-2 )begin
                    cnt<=cnt+1;
                end
                else begin
                    cnt<=0;
                    stage<=1;
                end

                if ( cnt==0 && stage==1 ) begin
                    phase<=phase+`TIME;
                    if ( phase==4*`TIME ) begin
                        phase<=0;
                    end
                end

                if ( phase==4*`TIME && cnt==`PERIOD-1 ) begin
                    status_flag<=1;
                end
            end


            else if ( status_flag==1 ) begin
                if ( cnt>=0 && cnt<=`PERIOD-phase-1) begin
                    led<=1;
                end
                else if ( cnt>=`PERIOD-phase && cnt<=`PERIOD-1 ) begin
                    led<=0;
                end

                if ( cnt>=0 && cnt<=`PERIOD-2 )begin
                    cnt<=cnt+1;
                end
                else begin
                    cnt<=0;
                    stage<=1;
                end

                if ( cnt==0 && stage==1 ) begin
                    phase<=phase+`TIME;
                    if ( phase==4*`TIME ) begin
                        phase<=0;
                    end
                end

                if ( phase==4*`TIME && cnt==`PERIOD-1 ) begin
                    status_flag_compute( cnt, phase, status_flag  );
                end
             end           
        end
   end


    task status_flag_compute;
        input [29:0] cnt ;
        input [29:0] phase ;
        output status_flag ;
        begin
            status_flag<=0;
        end
    endtask

endmodule

在最后用了一个task,但是task中用非阻塞赋值的时候,仿真结果是这样的:


                               
登录/注册后可看大图


把task里的非阻塞赋值改成阻塞赋值,结果才正确了:

                               
登录/注册后可看大图


我想问一下,verilog的task中,用非阻塞赋值和阻塞赋值有什么区别啊?时序电路用非阻塞赋值为啥这时候会出错?

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-28 13:04 , Processed in 0.018443 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表