Verilog编程之道 - case语句

这篇具有很好参考价值的文章主要介绍了Verilog编程之道 - case语句。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

case语句,是包含在case和endcase之间的代码,逻辑上等价于if-else语句,使用方法如下:

case (case_expression)
    case_item1 : case_item_statement1;
    case_item2 : case_item_statement2;
    case_item3 : case_item_statement3;
    case_item4 : case_item_statement4;
    default    :  case_item_statement5;
endcase

casez语句,允许"z" 和 "?"值在比较时被当作不关心,"z" 和 "?"时等价的。

        注意:当编写可综合代码时,要小心使用casez;使用casez时,最好使用"?" 表示不关心,不能使用"z" 表示不关心。

casex语句,允许"x" "z" 和 "?"值在比较时被当作不关心.

        注意:当编写可综合代码时,不要使用casez

case语句执行过程:

        1. 每次执行case语句时,括号内case expression 只计算一次,然后按照从上到下的顺序与每个case item比较。

        2. 如果有case default ,那么在这个从上到下的比较过程中忽略它。

        3. 如果有一个case item 与 case expression 匹配上,那么就执行此case item语句,然后终止case语句。

·        4. 如果所有比较都失败,而且有case default,那么就执行case default语句,然后终止case语句。

          5.如果所有比较都失败,而且没有case default,那么就终止case语句。

注意:1  排在前面的case item 具有更高的优先级。

           2 所有的case expression 和 case item的位长都将调整到最长的位长。

           3 如果有一个时unsigned,那么所有都按照unsigned调整。

  

case应用

        case可以检查x和z

case (sig)
    1'bz : $display ("signal is floating");
    1'bx : $display ("signal is unknown");
    default : $display ("signal is %b" ,sig);
endcase

      case item中有x和z时,这段代码时不可综合的

      可使用反向case语句,而且是优先级编码器。

reg [2:0] encode;
case (1) 
    encode[2] :$display ("Select Line 2");
    encode[1] :$display ("Select Line 1");
    encode[0] :$display ("Select Line 0");
    default   :$display ("Error: Only one of the bits is expected ON");
endcase

        case 语句可以时full 和parallel :若是full,就不会产生latch ; 若是parallel ,就不会产生优先级编码器。综合工具一般可以自由推导出是否是full 或parallel。

// 这段代码就是full 又是 parallel ,因此既不会生产Latch 也不会生成优先级编码器

always @ (*)
    begin
        case (sel)
            2'b00: outc = a;
            2'b01: outc = b;
            2'b10: outc = c;
            2'b11: outc = d;
        endcase
    end

       

// 若使用if ,就会生成优先级编码器。

always @ (*)
begin
    if(sel == 2'b00) outi = a;
    else if (sel == 2'b01) outi = b;
    else if (sel == 2'b10) outi = c;
    else                   outi = d;
end

Verilog编程之道 - case语句

 casez应用

        在case item中,0 1 z x都要进行比较,z和?对应的bit在比较时忽略,x不会被忽略。常用于实现优先编码器。

//实现指令译码,优先级编码器

reg [7:0] ir;
casez (ir)
    8'b1??????? : instruction1(ir);
    8'b01?????? : instruction2(ir);
    8'b00010??? : instruction3(ir);
    8'b000001?? : instruction4(ir);
endcase

casex 会导致设计出现问题, 把x当作不关心,前后防结果不一致。复位前的高阻值在复位后将初始化错误隐藏。

// 在case语句前给输出赋一个默认值,综合会当成full的case语句,不会产生Latch
// 在case前给出输出信号默认值,不会出现前后仿真不一致的情况。

module mux3c (y, a, b, c, sel);
    output     y;
    input    [1:0] sel;
    input        a, b, c;
    reg        y;
    always @ ( a or b or c or sel )
        y = 1'b0 ;    //<====== default value
        case (sel)    
            2'b00 : y = a;
            2'b01 : y = b;
            2'b10 :y = c;
        endcase
endmodule



//使用full_case综合指令
//仿真时,sel = 2'b11 ,y 表现为Latch;综合时,工具把sel == 2'b11时y输出当做不关心,从而导致前后防真不一致。

module mux3c (y, a, b, c, sel);
    output     y;
    input    [1:0] sel;
    input        a, b, c;
    reg        y;
    always @ ( a or b or c or sel )
        case (sel)        // synopsys full_case
            2'b00 : y = a;
            2'b01 : y = b;
            2'b10 :y = c;
        endcase
endmodule

full_case会优化设计,导致设计结果出错。

full_case还是有可能生成Latch(case中对多个输出进行赋值)

消除Latch最简单的方法:在always块的敏感表下面,在执行case语句之前为每个输出都赋一个默认值。

parallel_case是指case expression只能匹配一个case item的语句。如果发现case expression能够匹配超过一个的case item,那么这些匹配的case item被称为overlapping case item,这个case语句就不是parallel

// Synopsys dc_shell 在读入Verilog文件时,如果full_case语句用在不是full的case语句上会报告warning
// Non_full case statement with "full_case" directive

// parallel_case同样会出现警告。

//该警告会使设计崩溃。

case语句的编码原则

        1 对于编写表达式并行的设计,case语句是不错的选择,可使代码更加整洁

        2 在设计可综合代码时,要小心使用casez语句,不要是要casex语句

        3 要小心使用反向case语句,最好只针对时parallel的case语句使用

        4 要小心使用casez设计优先级编码器,可以用if-else-if语句实现优先级编码器,这样意图更明显

        5 在使用casez语句时,用?表示不关心的位。

        6 最好为case语句添加case default,而且不要把输出值赋值未x文章来源地址https://www.toymoban.com/news/detail-447696.html

到了这里,关于Verilog编程之道 - case语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java switch case 语句

    Java 的 switch case 语句是一种常用的控制流语句,用于基于不同的输入值执行不同的操作。本文将详细介绍 Java switch case 语句的作用、用法以及在实际工作中的应用。 一、switch case 语句的作用 switch case 语句是一种多分支条件语句,它基于不同的输入值,执行不同的操作。swit

    2024年02月11日
    浏览(38)
  • PostgreSQL中case when与position包含用法

    对于复杂的业务场景,代码与SQL都可以去实现一个场景。如果用代码去实现看起来代码会冗余,不高效,不如sql的效率与简洁。 pgsql与mysql中case when用法几乎一致。在SQL中,“Case When”语句用于选择判断,在执行时先对条件进行判断,然后根据判断结果做出相应的操作;语法

    2024年02月05日
    浏览(65)
  • Java switch case语句详解

    if…else 语句可以用来描述一个“二岔路口”,我们只能选择其中一条路来继续走,然而生活中经常会碰到“多岔路口”的情况。switch 语句提供了 if 语句的一个变通形式,可以从多个语句块中选择其中的一个执行。 switch 语句是 Java 的多路分支语句。它提供了一种基于一个表

    2024年02月16日
    浏览(36)
  • Linux:Linux操作系统流程控制语句-case语句使用介绍

    本博客将介绍Linux操作系统中流程控制语句-case语句的使用方法。我们将通过多个案例来详细说明case语句的执行流程和用法。这些案例包括菜单选项、rsync服务脚本、nginx服务脚本、实现系统工具箱和实现简单的jumpserver跳板机。通过学习这些内容,您将能够更好地掌握Shell脚本

    2024年02月12日
    浏览(47)
  • 【linux 脚本篇】流程控制语句-case

    目录 🍁案例一:菜单选项 🍂if语句执行 🍂case语句执行 🍁案例二:rsync服务脚本 🍂if语句执行 🍂case语句执行 🍁案例三:nginx服务脚本 🍁案例四:实现系统工具箱 🍁案例五:实现简单的jumpserver跳板机     🦐博客主页:大虾好吃吗的博客     🦐专栏地址:Linux从入门

    2024年02月07日
    浏览(46)
  • FPGA中的条件选择语句——case

    FPGA中的条件选择语句——case 在FPGA设计中,条件选择语句是非常重要的语法结构。其中一种形式是case语句。case语句用于在多种条件之间进行选择,是实现组合逻辑的基本构件之一。本文将详细讲述FPGA中的case语句。 case语句的格式如下所示: 其中,expression是一个变量或表达

    2024年02月04日
    浏览(48)
  • Python Switch 语句——Switch Case 示例

    在 3.10 版本之前,Python 从来没有实现 switch 语句在其他编程语言中所做的功能。 所以,如果你想执行多个条件语句,你将不得不使用elif这样的: 从 3.10 版本开始,Python 实现了一个称为“结构模式匹配”的 switch case 特性。您可以使用match和case来实现此功能。 有

    2024年02月12日
    浏览(52)
  • CASE WHEN函数语句多条件下使用详解

    目录 CASE 的两种格式: 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句,实现简单CASE函数和CASE搜索函数两种格式。 同时配合 SUM以及COUNT方法的使用 CASE 的两种格式:  简单CASE函数 和 CASE搜索函数 两种格式示例: 状态

    2024年02月11日
    浏览(72)
  • C语言 switch case 语句优化方案其一

                   这是一个用于计时的函数,细心的朋友应该可以发现,这段代码还隐藏一段 if 语句的优化方案,那就是 提前return,干掉else。                结构体内容如下: 当case语句较少的时候还能接收,假如很多的时候就会难以维护,这里提供一种思维。   

    2024年01月21日
    浏览(47)
  • 揭秘Java switch语句中的case穿透现象

    导语:在 Java 开发中,我们经常使用 switch 语句来进行条件判断和分支选择。然而,有一个令人困惑的现象就是,当某个 case 语句没有加上 break 时,程序会继续执行下一个 case 语句,这被称为 case穿透现象 。本文将揭秘 case穿透现象 的原因,并解释为何会出现这种行为

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包