Verilog教程语句块
我的学记|刘航宇的博客

Verilog教程语句块

刘航宇
3年前发布 /已收录
温馨提示:
本文最后更新于2022年08月09日,已超过963天没有更新,若内容或图片失效,请留言反馈。

Verilog 语句块提供了将两条或更多条语句组成语法结构上相当于一条一句的机制。主要包括两种类型:顺序块和并行块。

顺序块

顺序块用关键字 begin 和 end 来表示。
顺序块中的语句是一条条执行的。当然,非阻塞赋值除外。
顺序块中每条语句的时延总是与其前面语句执行的时间相关。
在本节之前的仿真中,initial 块中的阻塞赋值,都是顺序块的实例。
并行块
并行块有关键字 fork 和 join 来表示。
并行块中的语句是并行执行的,即便是阻塞形式的赋值。
并行块中每条语句的时延都是与块语句开始执行的时间相关。
顺序块与并行块的区别显而易见,下面用仿真说明。

仿真代码如下:

`timescale 1ns/1ns
 
module test ;
    reg [3:0]   ai_sequen, bi_sequen ;
    reg [3:0]   ai_paral,  bi_paral ;
    reg [3:0]   ai_nonblk, bi_nonblk ;
 
 //============================================================//
    //(1)Sequence block
    initial begin
        #5 ai_sequen         = 4'd5 ;    //at 5ns
        #5 bi_sequen         = 4'd8 ;    //at 10ns
    end
    //(2)fork block
    initial fork
        #5 ai_paral          = 4'd5 ;    //at 5ns
        #5 bi_paral          = 4'd8 ;    //at 5ns
    join
    //(3)non-block block
    initial fork
        #5 ai_nonblk         <= 4'd5 ;    //at 5ns
        #5 bi_nonblk         <= 4'd8 ;    //at 5ns
    join
 
endmodule

仿真结果如下:

如图所示,顺序块顺序执行,第 10ns 时,信号 bi_sequen 才赋值为 8。
而并行块,ai_paral 与 bi_paral 的赋值是同时执行的,所以均在 5ns 时被赋值。
而非阻塞赋值,也能达到和并行块同等的赋值效果。
图片[1] - Verilog教程语句块 - 我的学记|刘航宇的博客

嵌套块

顺序块和并行块还可以嵌套使用。
仿真代码如下:

`timescale      1ns/1ns
 
module test ;
 
    reg [3:0]   ai_sequen2, bi_sequen2 ;
    reg [3:0]   ai_paral2,  bi_paral2 ;
    initial begin
        ai_sequen2         = 4'd5 ;    //at 0ns
        fork
            #10 ai_paral2          = 4'd5 ;    //at 10ns
            #15 bi_paral2          = 4'd8 ;    //at 15ns
        join
        #20 bi_sequen2      = 4'd8 ;    //at 35ns
    end
 
endmodule

仿真结果如下:

并行块语句块内是并行执行,所以信号 ai_paral2 和信号 bi_paral2 分别在 10ns, 15ns 时被赋值。而并行块中最长的执行时间为 15ns,所以顺序块中的信号 bi_sequen2 在 35ns 时被赋值。
图片[2] - Verilog教程语句块 - 我的学记|刘航宇的博客

命名块

我们可以给块语句结构命名。
命名的块中可以声明局部变量,通过层次名引用的方法对变量进行访问。
仿真代码如下:

`timescale 1ns/1ns
 
module test;
 
    initial begin: runoob   //命名模块名字为runoob,分号不能少
        integer    i ;       //此变量可以通过test.runoob.i 被其他模块使用
        i = 0 ;
        forever begin
            #10 i = i + 10 ;      
        end
    end
 
    reg stop_flag ;
    initial stop_flag = 1'b0 ;
    always begin : detect_stop
        if ( test.runoob.i == 100) begin //i累加10次,即100ns时停止仿真
            $display("Now you can stop the simulation!!!");
            stop_flag = 1'b1 ;
        end
        #10 ;
    end
 
endmodule

仿真结果如下:

图片[3] - Verilog教程语句块 - 我的学记|刘航宇的博客
命名的块也可以被禁用,用关键字 disable 来表示。
disable 可以终止命名块的执行,可以用来从循环中退出、处理错误等。
与 C 语言中 break 类似,但是 break 只能退出当前所在循环,而 disable 可以禁用设计中任何一个命名的块。
仿真代码如下:

`timescale 1ns/1ns
 
module test;
 
    initial begin: runoob_d //命名模块名字为runoob_d
        integer    i_d ;
        i_d = 0 ;
        while(i_d<=100) begin: runoob_d2
            # 10 ;
            if (i_d >= 50) begin       //累加5次停止累加
                disable runoob_d3.clk_gen ;//stop 外部block: clk_gen
                disable runoob_d2 ;       //stop 当前block: runoob_d2
            end
            i_d = i_d + 10 ;
        end
    end
 
    reg clk ;
    initial begin: runoob_d3
        while (1) begin: clk_gen  //时钟产生模块
            clk=1 ;      #10 ;
            clk=0 ;      #10 ;
        end
    end
 
endmodule

仿真结果如下:

由图可知,信号 i_d 累加到 50 以后,便不再累加,以后 clk 时钟也不再产生。
可见,disable 退出了当前的 while 块。
图片[4] - Verilog教程语句块 - 我的学记|刘航宇的博客
需要说明的是,disable 在 always 或 forever 块中使用时只能退出当前回合,下一次语句还是会在 always 或 forever 中执行。因为 always 块和 forever 块是一直执行的,此时的 disable 有点类似 C 语言中的 continue 功能。

© 版权声明
THE END
喜欢就支持一下吧
点赞 1 分享 赞赏
时光轻拂,如花雅绽
评论 抢沙发
OωO
  • 惊讶
  • 撇嘴
  • 色
  • 发呆
  • 得意
  • 流泪
  • 害羞
  • 闭嘴
  • 睡
  • 大哭
  • 尴尬
  • 发怒
  • 调皮
  • 呲牙
  • 微笑
  • 难过
  • 酷
  • 抓狂
  • 吐
  • 偷笑
  • 可爱
  • 白眼
  • 傲慢
  • 饥饿
  • 困
  • 惊恐
  • 流汗
  • 憨笑
  • 悠闲
  • 奋斗
  • 咒骂
  • 疑问
  • 嘘
  • 晕
  • 折磨
  • 衰
  • 骷髅
  • 敲打
  • 再见
  • 发抖
  • 爱情
  • 跳跳
  • 猪头
  • 拥抱
  • 蛋糕
  • 炸弹
  • 刀
  • 便便
  • 咖啡
  • 玫瑰
  • 凋谢
  • 爱心
  • 心碎
  • 太阳
  • 月亮
  • 赞
  • 踩
  • 握手
  • 胜利
  • 飞吻
  • 怄火
  • 西瓜
  • 冷汗
  • 擦汗
  • 抠鼻
  • 鼓掌
  • 糗大了
  • 坏笑
  • 左哼哼
  • 右哼哼
  • 哈欠
  • 鄙视
  • 委屈
  • 快哭了
  • 阴险
  • 左亲亲
  • 吓
  • 可怜
  • 菜刀
  • 篮球
  • 示爱
  • 抱拳
  • 勾引
  • 拳头
  • 差劲
  • 爱你
  • NO
  • OK
  • 转圈
  • 挥手
  • 鞭炮
  • 喝彩
  • 爆筋
  • 棒棒糖
  • 喝奶
  • 手枪
  • 茶
  • 眨眼睛
  • 泪奔
  • 无奈
  • 卖萌
  • 小纠结
  • 喷血
  • 斜眼笑
  • doge
  • 惊喜
  • 戳一戳
  • 笑哭
  • 我最美
  • 羊驼
  • 幽灵
  • 大笑
  • 不开心
  • 呃
  • 求求
  • 点赞
  • 无聊
  • 托脸
  • 吃
  • 害怕
  • 飙泪
  • 我不看
  • 托腮
  • 啵啵
  • 糊脸
  • 拍头
  • 扯一扯
  • 舔一舔
  • 蹭一蹭
  • 顶呱呱
  • 抱抱
  • 暴击
  • 开枪
  • 撩一撩
  • 拍桌
  • 拍手
  • 干杯
  • 嘲讽
  • 哼
  • 佛系
  • 掐一掐
  • 颤抖
  • 偷看
  • 扇脸
  • 原谅
  • 喷脸
  • 生日快乐
  • 甩头
  • 扔狗
  • 脑阔疼
  • 沧桑
  • 捂脸
  • 辣眼睛
  • 哦哟
  • 头秃
  • 问号脸
  • 暗中观察
  • emm
  • 吃瓜
  • 呵呵哒
  • 我酸了
  • 汪汪
  • 汗
  • 无眼笑
  • 敬礼
  • 狂笑
  • 面无表情
  • 摸鱼
  • 魔鬼笑
  • 哦
  • 请
  • 睁眼
  • 敲开心
  • 让我康康
  • 摸锦鲤
  • 期待
  • 拿到红包
  • 拜谢
  • 元宝
  • 牛啊
  • 胖三斤
  • 好闪
  • 左拜年
  • 右拜年
  • 右亲亲
  • 牛气冲天
  • 喵喵
  • 打call
  • 变形
  • 仔细分析
  • 菜汪
  • 崇拜
  • 比心
  • 庆祝
  • 拒绝
  • 嫌弃
  • 吃糖
  • 惊吓
  • 生气
  • 举牌牌
  • 烟花
  • 虎虎生威
  • 豹富
  • 花朵脸
  • 我想开了
  • 舔屏
  • 打招呼
  • 酸Q
  • 我方了
  • 大怨种
  • 红包多多
  • 你真棒棒
  • 大展宏兔
  • 福萝卜
  • 坚强
  • 贴贴
  • 敲敲
  • 咦
  • 拜托
  • 尊嘟假嘟
  • 耶
  • 666
  • 裂开
  • 骰子
  • 包剪锤
  • 亲亲
  • 狗狗笑哭
  • 好兄弟
  • 狗狗可怜
  • 超级赞
  • 狗狗生气
  • 芒狗
  • 狗狗疑问
  • 奥特笑哭
  • 彩虹
  • 祝贺
  • 冒泡
  • 气呼呼
  • 忙
  • 波波流泪
  • 超级鼓掌
  • 跺脚
  • 嗨
  • 企鹅笑哭
  • 企鹅流泪
  • 真棒
  • 路过
  • emo
  • 企鹅爱心
  • 晚安
  • 太气了
  • 呜呜呜
  • 太好笑
  • 太头疼
  • 太赞了
  • 太头秃
  • 太沧桑
  • 龙年快乐
  • 新年中龙
  • 新年大龙
  • 略略略
  • 狼狗
  • 抛媚眼
  • 超级ok
  • tui
  • 快乐
  • 超级转圈
  • 别说话
  • 出去玩
  • 闪亮登场
  • 好运来
  • 姐是女王
  • 我听听
  • 臭美
  • 送你花花
  • 么么哒
  • 一起嗨
  • 开心
  • 摇起来
  • 划龙舟
经典
emoji
泡泡
阿鲁
颜文字
取消