📅  最后修改于: 2021-01-11 14:51:34             🧑  作者: Mango
case语句检查给定的表达式是否与列表和分支内的其他表达式之一匹配。通常习惯于实现设备。
如果存在测量单位要检查的许多条件,并且将其综合为优先级编码器而不是设备,则if-else构造可能不适用。
在Verilog中,case语句包括Verilog关键字,case(“ casez”,“ casex”)和endcase之间的所有代码。案例陈述可以是多选一的构造,大致类似于护理if-else-if陈述中的助理。
句法
Verilog case语句以case关键字开头,以endcase关键字结尾。
括号区域单位内的表达式旨在专门进行一次评估,并与书写顺序内的替代方案列表进行比较。
并且选择与给定的度量单位表达式匹配的声明为死。多个语句块应该进行排序,并且应在开始和结束之内。
case ()
case_item1 :
case_item2,
case_item3 :
case_item4 :
begin
end
default:
endcase
如果所有情况都不符合给定的表达式,则默认项目计量单位内的语句将失效。默认语句不是强制性的,并且在case语句中只有一个默认语句。 Case语句是嵌套的。
执行将退出case块,但是如果没有任何一项与表达式匹配,并且没有给出默认语句,则不执行任何操作。
例
下面的时尚模块包括一个2位信号选择信号,以将三个不同的3位输入之一路由到指定的符号。
case语句用于将正确的输入分配给支持sel值的输出。由于sel可以是2位信号,因此它将有20个2个组合,从零到3。如果sel为3,则默认语句有助于将输出设置为零。
module my_mux (input [2:0] a, b, c, // three 3-bit inputs
[1:0]sel, // 2-bit opt for signal to choose on from a, b, c
output reg [2:0] out); // Output 3-bit signal
// invariably block is dead whenever a, b, c or sel changes in value
invariably @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output can be a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is something, out is commonly zero
endcase
end
endmodule
case语句头由case(“ casez”,“ casex”)关键字和后跟case表达式组成,通常都在一行代码中。
当将full_case或parallel_case指令添加到case语句时,指令的度量单位将作为注释实时添加到case语句标题顶部的case表达式之后以及随后的任何代码行之前。
案例项目是将习惯的位,向量或Verilog表达式与案例表达式进行比较。
与“ C ”等不同的高级编程语言不同,Verilog的case语句包含隐式的break语句。
与此案例表达式相匹配的第一个案例项导致相应的案例项语句失效,因此为此跳过的所有其余案例事物度量单位都经过case语句。
如果案例项目与该案例表达式匹配,则案例项目语句是一个或多个终止的Verilog语句。与VHDL不同,Verilog的大小写本身可以是表达式。
要更改Verilog代码文档的解析,如果对于一个特定的案例项目来说,一条Verilog案例项目的语句中有多个是无效的,则应该在关键字“ begin”和“ end”之间加上Verilog案例项目的语句。
在Verilog中,有一个casez语句,它是case语句的变体,它启用“ z”和“?”整个案例比较中将其视为“无关”值。
“ Z”和“?”度量单位被视为无关,无论它们是否在case表达式内或是否在case项目内。
当秘密编写“不关心”的案例陈述时,请使用casez陈述并使用“?”字符而不是“ z”字符,目的是“无关”位。
在Verilog中,有一个casex语句,它是case语句的一种变体,它使“ z”,“?”和“ x”值在整个比较过程中都被视为“无关”值。
“ x”,“ z”和“?”度量单位被视为无关,无论它们是否在case表达式内或是否在case项目内。
完整case语句可以是case语句,其中所有可获取的case-expression二进制模式都与case项目或case默认值匹配。
如果case语句不包含case默认值,并且可以查找与任何已打印的case都不匹配的二进制case表达式,则case语句不完整。
完整的case语句可以是一个case语句,其中每个可获取的二进制,非二进制以及二进制和非二进制模式的混合都作为case语句装入case语句中。
Verilog并不希望案例陈述是完整的合成或高密度脂蛋白模拟,但是Verilog案例陈述通过添加案例默认值而变得完整。 VHDL希望案例陈述能够完全模拟高密度脂蛋白,而这通常需要在“其他”子句中进行关联。
并行case语句可以是内部的case语句,只能将case表达式与一个case项目匹配。
如果可以找到一个案例表达式,该案例表达式可能与一个案例项目相匹配,则匹配的案例事物度量单位表示为重叠案例事物,因此case语句不是并行的。
详细说明了RTL代码以获得代表4比1多路复用器的硬件原理图。
执行上述设计后,当sel为3时输出为零,并且与其他值的分配输入相对应。
ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0
[10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5
[20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5
[30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1
[40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0
ncsim: *W,RNQUIE: Simulation is complete.
在case语句中,仅当表达式的每一位与包括0、1,x和z的替代项之一匹配时,比较才会成功。在上面的示例中,如果sel中的任何位是x或z,则将执行默认语句,因为其他替代项均不匹配。在这种情况下,输出将全为零。
ncsim> run
[0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0
[10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0
[20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0
[30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0
[40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0
[50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0
[60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0
[70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0
[80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0
[90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0
ncsim: *W,RNQUIE: Simulation is complete.
如果设计中的case语句在case项目备选中包含x和z,则结果将有所不同。
module mux (input [2:0] a, b, c, output reg [2:0] out);
// Case items have x and z, and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz: out = a;
2'bzx: out = b;
2'bxx: out = c;
default: out = 0;
endcase
end
endmodule
case语句与if-else-if在两个方面不同,例如: