Verilog'da ifade biti genişliği nasıl kısaltılır?


11

Şunun gibi bir ifade düşünün:

assign x = func(A) ^ func(B);

burada fonk çıkışı 32 bit genişliğinde ve x 16 bitlik bir teldir. Ortaya çıkan xor için sadece en düşük 16 biti atamak istiyorum.

Yukarıdaki kod zaten bunu biliyorum, ama aynı zamanda bir uyarı oluşturur. "Açık" yaklaşım işe yaramıyor:

assign x = (func(A) ^ func(B))[15:0]; // error: '[' is unexpected

Yanıtlar:


8

Bu özellikle zarif olmasa da, başka bir değişken kullanabilirsiniz.

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

Daha iyi bir yaklaşım bir fonksiyon kullanmak olacaktır.

function [15:0] trunc_32_to_16(input [31:0] val32);
  trunc_32_to_16 = val32[15:0];
endfunction

assign x = trunc_32_to_16(func(A) ^ func(B));

Bundan daha güzel bir şey olmasını umuyordum ... Ah, sadece çok sayıda kesme işlevi oluşturacağım.
user23106

5

Örneğinizde, bitleri dolaylı olarak kesiyorsunuz.

Kesmeyi açık hale getirmek genellikle simülasyon / tüy / sentezdeki uyarıları kaldırabilir.

Bu satır içi yapmanın bir yolu, bir döküm operatörü kullanmaktır, örneğin:

typedef logic [15:0] HALF_WORD;
assign x = HALF_WORD'((func(A) ^ func(B));

Bağlamdan atılan tüm bitlerin 0 olduğu açıksa, bu yaklaşım mantıklı olabilir.

Bitlik bazı sıfırdan farklı olabilir, o zaman ben hala önceki önerilen @dwikle gibi bir ara net kullanarak öneririm cevap o aslında bit atıyor daha açıklık getiriyor: beri,. İşte yine referans için.

wire[31:0] y;

assign y = func(A) ^ func(B);
assign x = y[15:0];

1
Bunun sadece SystemVerilog'da çalışacağını düşünüyorum. İlginç olmayan.
Tom Carpenter

@TomCarpenter, kendinizi daha yeni birleşik IEEE Std 1800 revizyonlarından birinde bulunan tüm sentezlenebilir verilog setini kullanmak yerine, IEEE Std 1364-2005'te bulunan Verilog alt kümesiyle sınırlamak istiyor musunuz? Verilog standart 2009 yılında birleşik SystemVerilog standardı içine toplanabilir beri Sen, Verilog-2005 falan açıklamak demek isteyebilirsiniz
mattgately

3

Bunun hattın geri sayımına yardımcı olabileceğini düşünüyorum.

wire [15:0] not_used ;

assign {not_used, x} = (func(A) ^ func(B));

Bunun atamalar için geçerli olup olmadığından emin değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.