Verilog mengubah ukuran sisi kanan

Jan 14 2021

Saya memiliki modul dasar sebagai berikut untuk mendemonstrasikan sesuatu.

module tb();

reg [2:0] U;
reg [2:0] T;
reg [2:0] C;
reg E;

initial begin

    U = 5;
    T = 3;
    {E, C} = U + ~T + 1'b1;
    #1000;

end

endmodule

Yang saya harapkan adalah E menjadi 1, karena;

U aku s 101

T aku s 011

dan U + ~T + 001adalah,

   101
   100
   001
+______
= 1010 

Jadi, C mendapat 010 bagian dan E mendapat 1. Ini adalah perilaku yang diharapkan, namun, saya mendapatkan C sama tetapi E sebagai 0. Saya pikir Verilog meningkatkan ukuran variabel RHS menjadi 4 bit karena sisi kiri adalah 4 bit ( 1 + 3). Namun, untuk T, ia menambahkan di depan 0 sebelum melengkapi T, sehingga T menjadi 0011 dan komplemennya kebetulan 1100, bukan 0100, versi 4 bit dari komplemen T.

Dan ini mengarah pada,

   0101
   1100
   0001
+______
= 10010 

Yang menyebabkan E menjadi 0 seperti yang terlihat.

Saya tidak mengerti mengapa demikian, dan tidak dapat menemukan cara untuk membuat pelengkap terjadi sebelum menambahkan nol di depan.

Jika saya melakukan hal berikut, ini berfungsi dengan baik dan E mendapat 1:

    U = 5;
    T = 3;
    T = ~T;
    {E, C} = U + T + 1'b1;

Ini menegaskan bahwa kecurigaan saya benar. Jadi, saya punya solusi seperti itu, ya. Namun, saya tidak terlalu puas dengan itu, saya pikir harus ada cara untuk mencegah perilaku itu.

Bantuan apa pun akan dihargai.

Jawaban

3 dave_59 Jan 14 2021 at 05:55

Jika Anda memiliki operan campuran dengan lebar berbeda, Verilog memiliki aturan untuk menentukan ukuran setiap operan ke lebar operan terbesar berdasarkan konteks ekspresi. Anda dengan benar mencatat bahwa LHS adalah 4 bit, operan pada RHS diperpanjang hingga 4 bit. Ini terjadi sebelum menerapkan operasi.

Anda dapat memperbaikinya dengan memanfaatkan fakta bahwa operan rangkaian adalah konteks yang ditentukan sendiri:

{E, C} = U + {~T} + 1'b1;

Sekarang lebarnya ~Thanya ditentukan oleh lebarnya T.