0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA代码经验 case,casez,casex语句

454398 来源:FPGA技术联盟 作者:FPGA技术联盟 2020-12-11 10:42 次阅读

10. case,casez,casex语句

Verilog定义了case,casez和casex语句,用于做多种情况下的选择语句。

reg [1:0] sel;

reg [2:0] result;

always @(*)

case(sel)

2’b00: result = 3’d0;

2’b01: result = 3’d1;

2’b10: result = 3’d2;

endcase

使用case语句代替嵌套的if-else将会产生更易读的代码,更好的逻辑利用率和更高的性能。

casez和casex语句在比较中允许“don't care”条件。 casez将“z“”值视为"don't care",casex将“z”和“x”值都视为“don't care”。如果casez或casex表达式中的任何位都是"don't care value",那么该位将被忽略。以下是casez和casex的例子。

reg [1:0] sel;

reg [2:0] result;

// using casez

always @(*)

casez(sel)

2’b0?: result = 3’d0;

2’b10: result = 3’d1;

2’b11: result = 3’d2;

endcase

// using casex

always @(*)

casex(sel)

2’b0x: result = 3’d0;

2’b10: result = 3’d1;

2’b11: result = 3’d2;

Endcase

case的表达式可以是一个常量,如下例所示。

reg [1:0] sel;

reg [2:0] result;

always @(*)

case(1

~sel[1]: result = 3’d0;

sel[1] & ~sel[0]: result = 3’d1;

sel[1] & sel[0]: result = 3’d2;

Endcase

在案例中使用don't care条件很容易导致case 条件重叠或重复。而且,使用这些语句会导致综合和仿真不匹配。以下是案例case条件重叠的一个例子。

// casez statement contains overlapped case items

reg [1:0] sel;

reg [2:0] result;

always @(*)

casez(sel)

2’b0z: result = 3’d0;

2’b10: result = 3’d2;

2’b11: result = 3’d3;

2’b01: result = 3’d1; // overlap with 2’b0z

Endcase

允许重叠或重复的case条件,在大多数情况下不会触发任何仿真或综合警告。这是一种危险且难以调试的情况.。建议开发人员完全避免使用casex和casez语句。

在case语句中添加一个默认的条件是避免一系列问题的简单方法。 有两种方法可以达到相同的效果,如以下示例所示。

reg [1:0] sel;

reg [2:0] result;

// using default clause

always @(*)

case(sel)

2’b00: result = 3’d0;

2’b01: result = 3’d1;

2’b10: result = 3’d2;

default: result = 3’d3;

endcase

// 在case语句之前进行默认赋值

always @(*)

result = 3’d3;

case(sel)

2’b00: result = 3’d0;

2’b01: result = 3’d1;

2’b10: result = 3’d2;

Endcase

11. 在always块中混合阻塞和非阻塞赋值

Verilog指定了总是可以出现在块中的两种赋值类型:阻塞和非阻塞。阻塞和非阻塞赋值分别用于描述组合逻辑和时序逻辑。永远不要在同一个块中混合使用阻塞和非阻塞赋值。这样做可能会导致不可预知的综合和仿真结果。在许多情况下,综合工具不会产生任何警告,但综合结果将是不正确的。以下两个代码示例说明了阻塞和非阻塞赋值的混合使用。

reg blocking, non_blocking;

always @(posedge clk) begin

if(reset) begin

blocking = 0;

non_blocking

end

else begin

blocking = ^data;

non_blocking

end

end

always @(*) begin

blocking = ^data;

non_blocking

end

正确的方法是:

reg blocking, non_blocking;

always @(posedge clk) begin

if(reset) begin

non_blocking

end

else begin

non_blocking

end

end

always @(*) begin

blocking = ^data;

End

12. 多个阻塞赋值

always块中的阻塞赋值按其顺序执行。 尽管这样做通常很方便,但是建议开发者限制使用多个阻塞赋值来赋值always块中的相同变量。下面的两个代码示例显示了使用多个阻塞分配的潜在问题。

reg signal_a, signal_b, signal_c, signal_d;

always (*) begin

signal_a = signal_b & signal_c;

// …

// additional code

signal_d = signal_a & signal_e;

end

无意中改变signal_a和signal_d分配的顺序将会破坏signal_d的功能。

reg [15:0] signal_a, signal_b;

always (*) begin

signal_a[15:12] = 4’b0;

// …

// additional code

signal_a = signal_b;

End

signal_a的最后一个赋值优先,signal_a的位[15:12]永远不会被复位。

13. 使用命名的always块

以下是always块的例子。

reg reg_unnamed;

always @(posedge clk) begin : myname

// only visible in the “myname” block

reg reg_named;

// post-synthesis name : myname.reg_named

reg_named

// post-synthesis name : reg_unnamed

reg_unnamed

end // always

命名块可以在几种情况下有用。 因为always块是唯一标识的,所以在仿真中更容易找到它。 而且,限制变量的范围允许重复使用相同的变量名称。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1621

    文章

    21517

    浏览量

    599343
收藏 人收藏

    评论

    相关推荐

    Verilog HDL语言编程的误区与经验

    中使用casex语句当在可综合代码中使用casez语句时 要小心当写case
    发表于 03-26 08:00

    如何解决vhdl代码中的case语句问题?

    大家好 ...我在使用case语句时遇到问题....虽然我使用它如下::-------------------------------------------------- ---过程(CLK)开始
    发表于 06-26 11:47

    在SpinalHDL中关于casez的使用

    为:没什么大的问题。但我们知道,在Verilog中,存在casecasezcasex三种语法(本篇不做三种语法的区分与讨论,对此感兴趣的小伙伴可以自行百度)。像下面的这种代码:我们
    发表于 07-06 10:59

    verilog中if与case语句不完整产生锁存器的原因分析

      在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,下载内容中就谈到了其中原因。
    发表于 09-16 09:29 24次下载

    FPGA学习系列:if-else与case

    设计背景:不管是在什么软件和硬件语言,我们在我们的代码中都或多或少的用到这两条语句,if..else与case语句,今天我们将学习verilog中的这两条
    的头像 发表于 06-01 16:59 1.1w次阅读
    <b class='flag-5'>FPGA</b>学习系列:if-else与<b class='flag-5'>case</b>

    数字设计FPGA应用:case语句

    本课程以目前流行的Xilinx 7系列FPGA的开发为主线,全面讲解FPGA的原理及电路设计、Verilog HDL语言及VIVADO的应用,并循序渐进地从组合逻辑、时序逻辑的开发开始,深入到FPGA的基础应用、综合应用和进阶应
    的头像 发表于 12-03 07:02 5232次阅读
    数字设计<b class='flag-5'>FPGA</b>应用:<b class='flag-5'>case</b><b class='flag-5'>语句</b>

    CASE语句的执行规则是什么?

    CASE语句用来选择几个分支程序部分之一。选择是基于选择表达式当前值的。
    的头像 发表于 10-09 09:26 5254次阅读
    <b class='flag-5'>CASE</b><b class='flag-5'>语句</b>的执行规则是什么?

    一文浅析casecasexcasez区别

    先,case的描述,匹配都是从上到下进行的,如果使用了casez,看上面的casez的列表,只要输入有z/?的话,就能和任意匹配。
    发表于 09-30 14:56 3499次阅读

    RTL表达式和运算符

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else语句
    的头像 发表于 10-21 09:04 1209次阅读

    什么是SystemVerilog-决策语句-if-else语句

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else语句
    的头像 发表于 02-09 14:15 929次阅读
    什么是SystemVerilog-决策<b class='flag-5'>语句</b>-if-else<b class='flag-5'>语句</b>?

    Verilog中的If语句case语句介绍

    我们在上一篇文章中已经看到了如何使用程序块(例如 always 块来编写按顺序执行的 verilog 代码。 我们还可以在程序块中使用许多语句来控制在我们的verilog设计中信号赋值的方式
    的头像 发表于 05-11 15:37 3964次阅读
    Verilog中的If<b class='flag-5'>语句</b>和<b class='flag-5'>case</b><b class='flag-5'>语句</b>介绍

    Switch case中的case顺序

    ,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以,可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高性能。 此外,在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以
    的头像 发表于 11-20 18:16 674次阅读

    case后边可以跟多个语句

    是的,"case" 后面可以跟多个语句。在编程语言中,"case" 通常被用于 switch 语句中,用于检查一个变量或表达式是否匹配某个特定的值。当匹配成功时,可以执行一个或多个
    的头像 发表于 11-30 14:19 4883次阅读

    java switch case的语法规则

    在Java中,switch case语句是一种用于多分支选择的控制流语句。它允许根据某个表达式的值来执行不同的代码块。下面是关于switch cas
    的头像 发表于 11-30 14:40 1439次阅读

    java中的switch语句 case的取值

    Java中的switch语句是一种用于多重条件判断的语句,用于根据不同的条件执行不同的代码块。在switch语句中,case关键字用来指定不
    的头像 发表于 11-30 16:05 776次阅读