Verilog 如何将语句中的案例识别为完全覆盖的案例

Verilog 如何将语句中的案例识别为完全覆盖的案例,verilog,system-verilog,Verilog,System Verilog,我需要知道如何将陈述中的案例识别为完全涵盖的案例陈述。 请参见以下示例: module test(); logic [1:0] sel; initial begin sel = 2'b0x; // 2'b0z, 2'b0? $display("a is %b", sel); case (sel) inside 2'b00 : $display("caseinside : 2'b00"); 2'b01 : $display

我需要知道如何将陈述中的案例识别为完全涵盖的案例陈述。 请参见以下示例:

module test();
  logic [1:0] sel;
  initial begin
  sel = 2'b0x; // 2'b0z, 2'b0?
  $display("a is %b", sel);
  case (sel) inside
    2'b00 : $display("caseinside : 2'b00");
    2'b01 : $display("caseinside : 2'b01");
    2'b1x : $display("caseinside : 2'b1x");
    // 2'bxx : $display("caseinside : 2'bxx");
    default : $display("caseinside : default");
   endcase

   casex (sel)
     2'b00 : $display("casex : 2'b00");
     2'b01 : $display("casex : 2'b01");
     2'b1x : $display("casex : 2'b1x"); // 2'b1x => 2'b10, 2'b11
     default : $display("casex : default");
   endcase
   end
endmodule
这里我们有case-inside和casex语句。而且,案例选择器是一个四状态变量。 我们已经知道这个casex语句是一个完全覆盖的语句,因为它覆盖了所有的2'b00、2'b01和2'b1x(2'b10、2'b11)案例标签

但是,声明中的案例并不像一个完全涵盖的案例。因为,case-inside语句将达到给定选择器值“2'b0x”的默认case项。(模拟)

根据系统verilog-LRM和一些实验,我们可以在语句中表达case的行为,如下所示。(需要知道它是否正确)

  • 如果案例选择器的类型是四状态选择器,并且它包含 位字符串中的“x”(或“z”或“?”)值,然后匹配大小写 标签的相应位置必须有“x”值。(也包括其他 位必须匹配)

    例如:假设选择器值为
    3'b01x
    ,则匹配的大小写为 标签将是
    3'b01x
    3'b0xx
    3'bx1x
    3'bxxx

    根据这一点,case选择器可以有'3'bxxx',然后case-inside语句必须有'3'bxxx'标签才能成为该语句的一部分 完全覆盖的。如果这个case-inside语句 “3'bxxx'标签,则它可以匹配传递的任何3位值 通过案例选择器

在这些实验之后,我们构建了以下算法来检测语句中的case是否为完全覆盖语句:

[Algo]:(我们正在考虑相应的位字符串)

  • 如果选择器变量/表达式的类型为四状态

    然后,必须有一个大小写标签,其宽度与大小写选择器的宽度相匹配,并且它应该只包含“x”(或“z”或“?”)。这种语句内部的案例将被标识为完全覆盖的语句,否则就不是了

    (如果标签宽度>选择器宽度,则前导位字符应为“0”、“x”、“z”或“?”中的一个)

  • 如果选择器变量/表达式的类型为双状态

    然后我们可以使用casex的现有算法。(例如:如果大小写选择器的宽度为2,则大小写内部语句应具有“00”、“01”、“10”和“11”标签(“x”、“z”、“1”将根据2wild_card_count机制扩展为“0”和“1”)

请让我知道这个算法是否合适,或者我是否应该继续使用另一种方法(请建议您的算法)


[*注意:'default'子句不应出现在完全覆盖的语句中。完全覆盖的目的是切断'default'子句*]

我想您正在创建一个编译器linter或类似的东西

我假设宽度足够小,可以扩展每个标签并保留一组

const-din=document.getElementById('din')
const ul=document.getElementById(“扩展”);
函数刷新(e){
while(ul.lastChild){
ul.removeChild(ul.lastChild);
}
函数附加(前缀){
const li=document.createElement('li')
li.textContent=前缀;
ul.儿童(li);
}
常数s=标准值;
如果(!s)返回;
常量扩展位={
'0': ['0'],
'1': ['1'],
'x':['0','1','x','z'],
'z':['0','1','x','z'],
“?”:[“0”、“1”、“x”、“z”],
};
对于(设i=0;i=s.length){
附加(前缀);
}否则{
for(扩展位[s[i]]的常数b){
展开(前缀+b,i+1);
}
}
}
扩展(s.length+“'b”,0);
}
din.addEventListener(“输入”,刷新);
din.addEventListener(“更改”,刷新);
刷新()
标签

    在您的案例中,“完全覆盖”是什么意思?顺便说一句,无法编译模块“test”。示例中缺少一个程序块。您的案例语句必须是可合成的吗?“完全覆盖”的意思是:对于案例选择器可以提供的任何可能的值,除了“默认”标签外,应该有一个匹配的案例标签。(我想‘模块’测试’不能编译。您在示例中缺少一个程序块,将取决于平台。无论如何,请只考虑内部和CASE语句的情况。)在这种情况下,包含所有“X”的标签的行为与“默认”子句的方式相同。那么,重点是什么呢?我想,如果您不协调默认值,就不应该在算法中协调它。另外,你如何处理“独特/优先”的东西?这有点表明案例陈述是完全覆盖的,因为“sel”中不可能有未覆盖的值。此外,完全覆盖并不意味着它的行为正确。不同的病例类型会有所不同。case/x/z之间也存在差异。