2017-06-12 1 views
1

Je travaille sur un module dans le système Verilog avec le code suivant:corps Else est exécuté dans systemverilog

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 

Il semble que je devrais attendre result_o = 5, mais il est égal à 10. Je ne Je ne comprends pas pourquoi ma condition if est fausse.

Répondre

2

Le problème est la priorité de l'opérateur. IEEE Std 1800-2012, section 11.3.2 Priorité d'opérateur, montre que l'opérateur == a une priorité supérieure à l'opérateur binaire &. Cela signifie que votre code se comporte comme suit, avec des parenthèses ajouté:

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

Depuis rs_i n'est pas égal à 8'hF0, la clause if est fausse.

Pour obtenir votre comportement désiré, ajouter entre parenthèses comme suit:

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