2017-06-12 4 views
1

Ich arbeite an einem Modul im System Verilog mit dem folgenden Code:Else Körper in Systemverilog Ausführung

module my_module (input    [7:0] rd_i // rd_i = 00001001 
       ,input    [7:0] rs_i // rs_i = 10010010 
       ,output logic [7:0] result_o // result_o = 00001010 
); 

    always_comb 
     if ((rd_i << 4) & 8'hF0 == rs_i & 8'hF0) begin 
      result_o = 'b0101; 
     end 
     else begin 
      result_o = 'b1010; 
     end 
endmodule 

module my_module_tb(); 
    logic [7:0] rd_i = 'b00001001; 
    logic [7:0] rs_i = 'b10010010; 
    logic [7:0] result_o; 

    my_module uut (
     .rd_i(rd_i), 
     .rs_i(rs_i), 
     .result_o(result_o) 
    ); 
endmodule 

Es scheint, wie soll ich result_o = 5 erwarten, sondern gleich es 10 I don‘ Ich verstehe, warum meine If-Bedingung falsch ist.

Antwort

2

Das Problem ist Operator Vorrang. IEEE Std 1800-2012, Abschnitt 11.3.2 Operator Vorrang, zeigt die == Operator hat Vorrang vor dem binären & Operator. Dies bedeutet, dass Ihr Code wie die folgenden verhält, mit Klammern hinzugefügt:

if ((rd_i << 4) & (8'hF0 == rs_i) & 8'hF0) begin 

Da rs_i nicht gleich zu 8'hF0, die if Klausel falsch ist.

Ihr gewünschtes Verhalten zu erhalten, fügen Sie Klammern wie folgt:

if (((rd_i << 4) & 8'hF0) == (rs_i & 8'hF0)) begin