实际问题中常常需要用到多分支选择,使用if语句导致内容繁琐;更明智的做法是使用case语句,case语句是一种多分支选择语句,可以方便的处理多分支选择。本文通过实际例子,讲解case语句的使用,以及case语句的变体casez和casex的使用:

目录

一、case的用法

形式:

功能:

注意:

测试:

二、casez与casex的用法

三、参考文献


一、case的用法

形式:

case(控制表达式/值)

分支表达式:执行语句

default:执行语句

endcase

功能:

自上而下,按照顺序逐个对分支表达式进行判断,如果这一分支表达式等于控制表达式的值,就执行其对应操作;均不相等时,执行default操作;

注意:

分支表达式不能重复,否则会出现冲突;

执行完某一操作后,跳出case语句;

控制表达式与多个分支表达式匹配,只执行从上至下首个匹配项(判断顺序进行,执行一次后就跳出case语句了);

测试:

  设计一个四选一器件,验证case语句功能:

实现代码如下:

`timescale 1ns / 1ps
//
// Company:
// Engineer: guoliang CLL
//
// Create Date: 2020/03/02 16:51:44
// Design Name:
// Module Name: case_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module case_test(
input [1:0]sel,
output reg [3:0]dout);
always@(*)
begincase(sel)2'b00:begindout = 4'b0000;end2'b01:begindout = 4'b0001;end2'b10:begindout = 4'b0011;end2'b11:begindout = 4'b0111;enddefault:begindout = 4'b1111;endendcase
end
endmodule

测试文件如下:

`timescale 1ns / 1ps
//
// Company:
// Engineer: guoliang CLL
//
// Create Date: 2020/03/02 16:56:45
// Design Name:
// Module Name: case_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module case_tsb();
reg [1:0]sel;
wire [3:0]dout;
initial
beginsel = 2'b00;#10 sel = 2'b10;#10 sel = 2'b11;#10 sel = 2'b01;
end
case_test inst1(.sel(sel),.dout(dout));
endmodule

仿真结果如下:

对应RTL电路如下:

二、casez与casex的用法

casez进行控制表达式与分支表达式的比较时,不关注高阻态位(不管是控制表达式还是条件表达式,这些位均默认为匹配);
casex进行控制表达式与分支表达式的比较时,不关注高阻态,以及不定位(不管是控制表达式还是条件表达式,这些位均默认为匹配);

示例1:

对于case语句:

case (sel)2'b00:      y = a;2'b01:      y = b;2'bx0:      y = c;2'b1x:      y = d;2'bz0:      y = e;2'b1?:      y = f;default :   y = g;
endcase

对应的结果为:

Result:sel     y  case item    00      a  00    11      g  default    xx      g  default    x0      c  x0    1z      f  1?    z1      g  default

可以看出,case可以识别出1/0/x/z,必须完全匹配才能执行对应的执行语句;反之就匹配default;

对于casez语句:

casez (sel) 2'b00:      y = a; 2'b01:      y = b; 2'bx0:      y = c; 2'b1x:      y = d; 2'bz0:      y = e; 2'b1?:      y = f; default:    y = g;
endcase

对应的结果为:

Result:sel     y  case item00      a  0011      f  1?xx      g  defaultx0      c  x0 (would have matched with z0(item 5) if item 3 is not present.)1z      d  1x (would have matched with z0(item 5) & 1?(item 6) also.)z1      b  01 (would have matched with 1?(item 6) also.)

可以看出,casez会把z/?匹配成任意,也会把任意匹配成z/?的;

对于casex语句:

casex (sel) 2'b00   :   y = a; 2'b01   :   y = b; 2'bx0   :   y = c; 2'b1x   :   y = d; 2'bz0   :   y = e; 2'b1?   :   y = f; default :   y = g;
endcase

对应的结果为:

Result:  sel     y  case item 00      a  00 11      d  1x (would have matched with 1? also) xx      a  00 (would have matched with all items) x0      a  00 (would have matched with all items except 01) 1z      c  x0 (would have matched with all items except 00,01) z1      b  01 (would have matched with 1x, 1? also)

可以看出,casex会把x和z/?匹配成任意,也会把任意匹配成x和z/?的;

三、参考文献

https://www.cnblogs.com/poiu-elab/archive/2012/11/02/2751323.html

Verilog中Case语句相关推荐

  1. JAVA语法中case语句的特性

    JAVA语法中case语句的特性: 1.case拥有穿透机制, 若case后不写break,如果命中了某个case语句步骤,下面的case结果将会同时执行.建议写完一个case后 针对break的增加 ...

  2. Verilog中case,casez,casex语句的用法

    文章目录 1.case的用法 2.casez/casex的用法 3.case语句的常数表达式 1.case的用法 case语句是一种多路选择结构语句,根据表达式(expression)中的值,对选项( ...

  3. Verilog中for语句的使用

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  4. Verilog中生成语句(generate)的用法

    一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function, ...

  5. verilog中for语句使用

     在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在T ...

  6. Verilog中case,casex,casez的区别

    在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配. Note: casez与casex语句是case语句的两种变体, 在写testbench时用到,属于不可综合的 ...

  7. Verilog中for 语句怎么用

    类似C的环路结构如for-loop可能对学过C语言的人存在陷阱.其原因是在硬件语言中并没有隐含的寄存器这个条件,所以一般这些环路不可以在可综合代码中用来做算法迭代.在Verilog中,for循环一般用 ...

  8. verilog中assign语句

    /************************************** * Module: assign * Date:2014-08-10 * Author: hemmingway@163. ...

  9. java中case语句_Java:switch-case语句

    我们生活中总会出现形形色色的选择,中意选择的不同,往后的故事往往也不尽相同.计算机中想要实现现实中的选择交互,就需要用到"选择语句".当然简单的选择可以用if...else..., ...

最新文章

  1. mysql col与row_使用mysql实现row_number() over(partition by col1 order by col2)函数
  2. _disable_logging 对于归档数据库的影响
  3. Windbg学习 (0x0002) 命令基础
  4. python3 三角函数
  5. 全国计算机等级考试题库二级C操作题100套(第82套)
  6. java视频压缩 lz4_一种视频序列帧的压缩方法、解压方法及装置与流程
  7. Excel合并单元格基础注意事项(VSTO 2005)
  8. android监听自身被卸载的方法
  9. c语言冒泡排序法程序填空_五种数组的排序方法(C语言)Part1
  10. 武汉CMMI3-CMMI5三年到期后复审指南
  11. FIR滤波器结合快速卷积滤波
  12. java获取指定日期当月和下个月的第一天
  13. 深入理解Zend执行引擎
  14. web安全攻防渗透+赵雨佳43
  15. python 流水作业调度,流水作业调度完整代码
  16. U盘和存储卡实际上可以轻松的创建隐藏分区制作PE启动盘
  17. 噪声分析基础(公式)知识
  18. 关于项目管理的通俗讲解
  19. 京东与苏宁之争,用户体验的博弈
  20. 长沙有哪些比较有名的互联网公司?

热门文章

  1. 毁灭一切还是重塑世界?AI已成为人类故事中心
  2. linux mint 18.3 内核,Linux Mint 18.3 “Sylvia” KDE和Xfce版本正式发布
  3. 【Meetup预告】OpenMLDB+37手游:一键查收实时特征计算场景案例及进阶使用攻略
  4. matlab之判别分析
  5. 玩客云退出链克计划后还是会下载缓存垃圾,程序员教你如何彻底绝育玩客云老母鸡
  6. python-selenium登陆今日头条
  7. Zotero 6 文献管理 + 内置PDF阅读器 + 选中翻译
  8. 向世界问好,.NET 5 从 Fur 框架开始,v1.0.0.rc2 发布
  9. openxml的视频教程
  10. 删除单号中的符号并查询快递物流信息