Verilog sağ tarafın boyutunu değiştiriyor

Jan 14 2021

Bir şeyi göstermek için aşağıdaki gibi temel bir modülüm var.

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

Beklediğim şey E'nin 1 olması, çünkü;

U dır-dir 101

T dır-dir 011

ve U + ~T + 001olduğu

   101
   100
   001
+______
= 1010 

Yani, C 010 kısım alır ve E 1 alır. Bu beklenen davranış, ancak C'yi aynı ama E'yi 0 olarak alıyorum. Verilog'un RHS değişkenlerinin boyutlarını 4 bite çıkardığını düşünüyorum çünkü sol taraf 4 bit 1 + 3). Bununla birlikte, T için, T'yi tamamlamadan önce 0'ı ekler, bu nedenle T, 0011 olur ve onun tamamlayıcısı, T tamamlayıcısının 4 bitlik versiyonu 0100 yerine 1100 olur.

Ve bu yol açar,

   0101
   1100
   0001
+______
= 10010 

Bu da görüldüğü gibi E'nin 0 olmasına neden olur.

Bunun neden böyle olduğunu anlamıyorum ve başına sıfır eklemeden önce tamamlamayı gerçekleştirmenin bir yolunu bulamadım.

Bunun yerine aşağıdakileri yaparsam iyi çalışır ve E 1 alır:

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

Bu, şüphemin doğru olduğunu doğruluyor. Öyleyse, böyle bir çözümüm var, evet. Ancak bundan pek memnun değilim, bence bu davranışı önlemenin bir yolu olmalı.

Herhangi bir yardım memnuniyetle karşılanacaktır.

Yanıtlar

3 dave_59 Jan 14 2021 at 05:55

Farklı genişliklerin karışımlarından oluşan işlenenlere sahip olduğunuzda, Verilog, her işleneni, ifadenin bağlamına göre en büyük işlenenin genişliğine göre boyutlandırma kurallarına sahiptir. LHS'nin 4 bit olduğunu, RHS üzerindeki işlenenlerin 4 bite genişletildiğini doğru bir şekilde not ettiniz. Bu işlem uygulanmadan önce gerçekleşir.

Bir birleştirmenin işlenenlerinin kendi kendine belirlenen bağlamlar olması gerçeğinden yararlanarak bunu düzeltebilirsiniz:

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

Şimdi genişliği ~Tyalnızca genişliğine göre belirlenir T.