unique
使用方法:
unique case(<case_expression>)
...//条件选项
endcase
其作用等效于同时使用verilog中的full_case及parallel_case。
**parallel_case:**在Verilog中使用的方式是
case (CASE_SIGNL) // synopsys parallel_case
上述语句是告诉综合器,不需要产生优先级逻辑,从而缩小了硬件的规模。缺点是,设计者要保证所有的case不会同时发生,否则case里面的某些信号会被赋予一个不确定的值。适合于不需要产生优先级的case
full_case: 对于case来说,如果没有default的选项,综合器会产生一个latch,因为CASE都不成立时,A要保持上一次的值。但是一般情况下,设计者是不愿意产生latch的。因此full_case就是告诉综合器,所有的CASE已经覆盖,不需要产生latch。但是需要注意的是:设计者要保证只会有所设计的CASE,不会有其他Case的出现,否则case里的信号会是一个不确定的值。
case (CASE_SIGNL) // synopsys full_case
回到SystemVerilog的语句说明中来:
unique case:该语句指定,必须有且只有一个条件选项与条件表达式匹配。通俗的讲,使用这个语句,case的条件没有由上至下的优先级,同时也不用加default项,不会产生latch。但是你必须得保证所有case都可以被覆盖,同时不会同时发生。否则就会有不定态值产生。
示例代码:
unique case (1'b1)
csr_save_cause_i: begin
unique case (1'b1)
csr_save_if_i:
exception_pc = pc_if_i;
csr_save_id_i:
exception_pc = pc_id_i;
default:;
endcase
priv_lvl_n = PRIV_LVL_M;
mstatus_n.mpie = mstatus_q.mie;
mstatus_n.mie = 1'b0;
mstatus_n.mpp = PRIV_LVL_M;
mepc_n = exception_pc;
mcause_n = csr_cause_i;
end //csr_save_cause_i
csr_restore_mret_i: begin //MRET
mstatus_n.mie = mstatus_q.mpie;
priv_lvl_n = PRIV_LVL_M;
mstatus_n.mpie = 1'b1;
mstatus_n.mpp = PRIV_LVL_M;
epc_o = mepc_q;
end //csr_restore_mret_i
default:;
endcase
priority:
等效于verilog中的full_case,也就是不会产生latch,但是会保留优先级的逻辑。
该语句指定:
至少有一个条件选项与条件表达式相符,若存在多个条件选项的值与条件表达式匹配,则必须执行第一个匹配分支。
priority case(<case_expression>)
...//条件选项
endcase