2017-06-12 24 views
1

我正在一個模塊上的系統的Verilog用下面的代碼:否則身體在系統執行的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 

好像我應該期待result_o = 5,而是它等於10.我不不明白爲什麼我的條件評估是錯誤的。

回答

2

問題在於運算符的優先級。 IEEE Std 1800-2012,部分11.3.2運算符優先級,顯示==運算符具有比二進制運算符&更高的優先級。這意味着你的代碼的行爲就像下面,添加了括號:

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

由於rs_i不等於8'hF0,該if子句是假的。

爲了得到你想要的行爲,加括號如下:

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