Bagaimana cara memotong lebar bit ekspresi di Verilog?


11

Pertimbangkan ungkapan seperti:

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

di mana output dari func adalah lebar 32 bit, dan x adalah kawat 16 bit. Saya hanya ingin menetapkan 16 bit terendah dari xor yang dihasilkan.

Saya tahu kode di atas sudah melakukan itu, tetapi juga menghasilkan peringatan. Pendekatan "jelas" tidak berhasil:

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

Jawaban:


8

Anda dapat menggunakan variabel lain, meskipun ini tidak terlalu elegan.

wire[31:0] y;

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

Pendekatan yang lebih baik adalah menggunakan fungsi.

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));

Saya berharap akan ada sesuatu yang lebih bagus dari itu ... Oh well, saya hanya akan membuat sejumlah besar fungsi pemotongan.
user23106

5

Dalam contoh Anda, Anda secara implisit memotong bit.

Membuat pemotongan secara eksplisit sering dapat menghapus peringatan dalam simulasi / lint / sintesis.

Salah satu cara untuk melakukan ini secara in-line adalah dengan menggunakan operator transmisi, misalnya:

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

Pendekatan ini mungkin masuk akal jika jelas dari konteks bahwa semua bit yang dijatuhkan adalah 0's.

Jika beberapa bit mungkin bukan nol maka saya akan menyarankan masih menggunakan net perantara seperti @dwikle yang disarankan dalam jawaban sebelumnya , karena itu membuatnya lebih jelas bahwa Anda benar-benar membuang bit. Ini lagi untuk referensi.

wire[31:0] y;

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

1
Saya pikir itu hanya akan bekerja di SystemVerilog. Menarik bukan-kurang.
Tom Carpenter

@ TomCarpenter, apakah Anda ingin membatasi diri Anda pada subset Verilog yang tersedia di IEEE Std 1364-2005, daripada menggunakan set lengkap Verilog yang dapat disintesis yang tersedia di salah satu revisi IEEE Std 1800 yang lebih baru? Anda mungkin ingin mengatakan Verilog-2005 atau sesuatu untuk memperjelas, karena standar Verilog dimasukkan ke dalam standar SystemVerilog terpadu pada tahun 2009.
mattgately

3

Saya pikir ini mungkin membantu menjaga agar garis tetap rendah.

wire [15:0] not_used ;

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

Tidak yakin apakah itu valid untuk yang ditugaskan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.