u@home:~$

verilog 里 order of priority 实现的方式

a的priority最高。

wire event_a;
wire event_b;
wire event_c;
wire event_d;

wire a_select;
wire b_select;
wire c_select;
wire d_select;

assign a_select = event_a;

assign b_select = ~event_a &
                   event_b;

assign c_select = ~event_a &
                  ~event_b &
                   event_c;

assign d_select = ~event_a &
                  ~event_b &
                  ~event_c &
                   event_d;

如果2进制编码的话,可以这样,3bit没用完,就不搞太多x_select。

wire [2:0] encode;

assign encode = {3{a_select}} & 3'b001    |
                {3{b_select}} & 3'b010    |
                {3{c_select}} & 3'b011    |
                {3{d_select}} & 3'b100    |
                };

也可以这样用, 不用encode。

always @* begin
   case({a_select, b_select, c_select, d_select})
      4'b0000
      begin
      // none selected
      end
      4'b0001:
      begin
      // select d
      end
      4'b0010:
      begin
      // select c
      end
      4'b0100:
      begin
      // select b
      end
      4'b1000:
      begin
      // select a
      end
      default:
      begin
      // default, handle error
      end
   endcase
end