2017-06-12 3 views
1

を実行している私は、次のコードで、システムのVerilogでモジュールに取り組んでいます:エルス体は、System Verilogで

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 

「私は= 5 result_oを期待するべきであるように思えるが、代わりにそれは10 Iドンに等しいですなぜ私のif条件が偽と評価されているのか理解できません。

答えて

2

問題は演算子の優先順位です。 IEEE Std 1800-2012、セクション11.3.2演算子の優先度は、==演算子がバイナリ&演算子より高い優先順位を持つことを示しています。

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

rs_i8'hF0に等しくないので、if句がfalse:これはあなたのコードが追加括弧で、以下のように振る舞うことを意味します。次のように

は、括弧を追加し、ご希望の動作を取得するには、次の

if (((rd_i << 4) & 8'hF0) == (rs_i & 8'hF0)) begin 
関連する問題