有时候面对多个事件同时发生,却没有足够的资源去处理全部事件,或者无需全部处理,这时就要引入“优先事件”的概念。
举个例子,假设现在有一个请求指令同时包含如下错误:
- 校验检测错误(ECC error或者parity error)
- 无效操作代码(Illegal opcode)
- 无效地址(Invalid address)
而系统规定:
- 如果出现无效操作代码,则抛弃当前指令并引发中断;
- 如果操作代码正确,但地址错误,则记录错误地址并引发中断;
- 如果操作代码和地址均正确,ECC错误,则向源设备返回错误信号。
按照正常思路,这段错误处理代码大致如下:
[code lang="verilog"]
if (ill_opcode) // Illegal opcode
begin
interrupt = 1'b1;
end
else if (inv_addr) // Invalid address
begin
rec_addr <= addr;
interrupt = 1'b1;
end
else if (ecc_err) // ECC error
begin
err_resp = 1'b1;
end
else
...
[/code]
这么写虽然没什么毛病,但是如果这样简化一下,既可以提高可维护性,又能达到同样的效果。
[code lang="verilog"]
case(1'b1)
ill_opcode: interrupt = 1'b1; // Illegal opcode
inv_addr: // Invalid address
begin
rec_addr <= addr;
interrupt = 1'b1;
end
ecc_err: err_resp = 1'b1; // ECC error
default: ...
[/code]