Verilog:使用casex进行合成

Verilog:使用casex进行合成,verilog,Verilog,我希望实现一个并行case块,它将检查16位寄存器的值。在某些情况下,我需要它来检查所有16位。然而,在其他情况下,我只需要检查几个。casex是否适用于这种情况?如果您尚未推断,它将被合成 它是微处理器控制矩阵的一部分。这是一台连接到指令寄存器的摩尔机器。指令的宽度为16位。对于某些指令,例如mov,机器状态完全相同,只是寄存器/内存寻址不同。该指令包含关于它引用的寄存器或内存的信息,因此我不需要为每一条可能的指令都明确说明一个案例 例如,如果我的操作码是1111,剩下的12位是寻址,我可以简

我希望实现一个并行case块,它将检查16位寄存器的值。在某些情况下,我需要它来检查所有16位。然而,在其他情况下,我只需要检查几个。casex是否适用于这种情况?如果您尚未推断,它将被合成

它是微处理器控制矩阵的一部分。这是一台连接到指令寄存器的摩尔机器。指令的宽度为16位。对于某些指令,例如mov,机器状态完全相同,只是寄存器/内存寻址不同。该指令包含关于它引用的寄存器或内存的信息,因此我不需要为每一条可能的指令都明确说明一个案例

例如,如果我的操作码是1111,剩下的12位是寻址,我可以简单地使用16'B1111XXXXXXXXXX的大小写


我希望它是并行的,所以我不使用if-else语句。我不确定这是否会按照我的预期工作。如果您有任何建议,我们将不胜感激。

是的,您可以使用casex或casez

例如:

有了casez,你可以用?对于“不在乎”值:

logic[7:0] ir;
casez(ir)
8'b1???????: instruction1(ir);
8'b01??????: instruction2(ir);
8'b00010???: instruction3(ir);
8'b000001??: instruction4(ir);
endcase
下面是casex语句的一个示例。它演示了在模拟过程中如何动态控制不关心条件的极端情况。在本例中,如果 r=8'b01100110,则调用任务stat2

logic[7:0] r, mask;
mask = 8'bx0x0x0x0;
casex(r ^ mask)
8'b001100xx: stat1;
8'b1100xx00: stat2;
8'b00xx0011: stat3;
8'bxx010100: stat4;
endcase

只是因为我很好奇,为什么需要检查这个case语句中的所有16位?我认为这个case语句只需要看一下4位操作码就可以对其进行解码。您可以在单独的逻辑中进一步解码。除非您的操作码根据操作改变大小……是的,这只是一个例子。操作码确实会随着操作的不同而变化。@Russell尽管如此,我还没有真正考虑指令集。五位或六位操作码后跟剩余的十位或十一位可能有用,而不是检查所有十六位。它所要做的就是正确地读取不同的指令格式。仅供参考,使用case语句(
case
casez
casez
)不能保证并行的case。这通常是一个级联的情况。使用
parallel_case
synthesis指令。没有标准,请参阅用户手册。对于SystemVerilog,并行大小写可以通过在case语句前面加上
unique
关键字来实现。
casex
将吞掉x。因此,我们的设计审查了ban
casex
并允许
casez
达到相同的效果,但如果输入来自多个驱动程序、未初始化的注册表等,则输出也是
x
,这使得调试更加容易。