仔细观察

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

偶然看到了一段代码,可以做如下等效

always@(posedge clk, negedge rstn)begin
    if(!rstn)
        rr <= 1'b0;
    else begin
        rr <= 1'b0;
        if(en)
            rr <= 1'b1;
    end
end

一开始我认为这样写是错误的,因为当en为1时两个非阻塞赋值会同时发生,这样这段代码最后的行为可能会取决于语句的顺序。然后我用irun仿真了一下发现确实是这样。本来以为这样就结束了,但是接下来我又综合了一下,发现综合工具不会报错或者警告,而是综合出一个D触发器,en是触发器的D端。

仔细思考一下我才意识到问题所在:非阻塞赋值的“赋值”这一动作确实是在NBA阶段同时发生的,但是前提是语句在同一个block中,这段代码第五行和第七行其实并不在同一个block中,因为if语句算一个block,而block和block是顺序的,于是这段代码等效于下面的代码

always@(posedge clk, negedge rstn)begin
    if(!rstn)
        rr <= 1'b0;
    else if(en)
        rr <= 1'b1;
    else
        rr <= 1'b0;
end

这恰恰也和综合的结果相对应。

posted on 2023-12-07 10:13  注意看  阅读(14)  评论(0编辑  收藏  举报