Verilog mengubah ukuran sisi kanan
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
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.