2015-02-20 19 views
5

Trong đoạn code Verilog đơn giản sau đây:Verilog "~" nhà điều hành trong hoạt động bổ sung cho kết quả không mong muốn

wire [31:0] depth; 
wire mode_u2 = 1'h0; 

assign depth = 'h80 + (~mode_u2); 

nếu tôi làm một bảng hiển thị chiều sâu, và mô phỏng nó với VCS (2014.12-1)

$display("depth is 0x%2x", depth); 

Tôi đang nhận được 0x7f, thay vì dự kiến ​​0x81. nó có vẻ như ~ mode_u2 được coi là trừ đi 1.

Nếu tôi thay đổi ~mode_u2-!mode_u2. Tôi nhận được 0x81 như mong đợi.

gì thú vị hơn là nếu tôi làm wire mode = ~mode_u2 và sau đó assign depth = 'h80 + (~mode) thay vì 0x80, tôi nhận được 0x7e

Tôi có thiếu cái gì ở đây?

Ai đó có thể giải thích lý do tại sao ~ hoạt động theo cách này trong hoạt động +? Hay đây là một trong những mô phỏng và tổng hợp đó là tình huống khác nhau?

Rất cám ơn !!

Willie

Trả lời

2

Các toán hạng của toán tử add cần phải được mở rộng với kích thước của phía bên tay trái (hoặc chiều rộng tối đa của hai toán hạng tùy thuộc vào ngữ cảnh) trước khi việc bổ sung được thực hiện.

Trong trường hợp này, mode_u2 cần được mở rộng đến 32 bit. Tôi không thể tìm thấy một tham chiếu cho điều này, nhưng có vẻ như phần mở rộng bit được ưu tiên hơn toán tử ~. Điều đó có nghĩa:

depth = 'h80 + (~mode_u2) = 
     32'h0000_0080 + (~32h0000_0000) = 
     32'h0000_0080 + 32'hffff_ffff = 
     32'h0000_007f 

Kết quả của ! điều hành, tuy nhiên theo định nghĩa là một chút duy nhất, và tôi đoán là phần mở rộng chút xảy ra hai lần:

depth = 'h80 + (!mode_u2) = 
     32'h0000_0080 + (!32'h0000_0000) = 
     32'h0000_0080 + 1'h1 = 
     32'h0000_0080 + 32'h0000_0001 = 
     32'h0000_0081 

Tương tự như vậy cho mode:

depth = 'h80 + (~mode) = 
     32'h0000_0080 + (~32'h0000_0001) = 
     32'h0000_0080 + 32'hffff_fffe = 
     32'h0000_007e 
+0

Tôi nghĩ rằng bạn đang đi đúng hướng, nhưng tiện ích mở rộng 32 bit của 0 là '32'h0000_0000' và từ khóa phủ định bit là' 32'hffff_ffff'. – toolic

+0

@toolic: Cảm ơn. Đã sửa. – Ari

+0

@Ari: Tôi đã suy nghĩ về cùng một điều, điều này nên là lời giải thích duy nhất có thể. Tuy nhiên một điều đáng nói đến là, nếu nó đang làm 0x80 + tất cả fs, sau đó khi tôi in 33 bit của độ sâu kết quả, MSB là không 1? và cũng có thể, khi bạn làm + (~ mode), tại sao nó thêm ~ 32'h0000_0001, không ~ 32'hffff_ffff vì chế độ là ~ mode_u2. – shakimura

Các vấn đề liên quan