Verilog sağ tarafın boyutunu değiştiriyor
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 + 001
olduğ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
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 ~T
yalnızca genişliğine göre belirlenir T
.