Маскируйте поле в упакованной структуре в SystemVerilog

#verilog #system-verilog

Вопрос:

Я ищу лучший способ замаскировать поле внутри упакованной структуры.

Представьте, что у вас есть:

 typedef struct packed {
  logic [5:0] add;
  logic [3:0] data;
  logic [1:0] control;
} mytype;
 

Я хочу назначить новому сигналу сигнал с данными, замаскированными под ноль. В моем случае структура имеет много полей, поэтому я предпочитаю не назначать их по одному, если это возможно, как это:

 my_type new_signal;

assign new_signal.add     = old_signal.add;
assign new_signal.data    = '0;
assign new_signal.control = old_signal.control;
 

Мне это нужно, чтобы сравнить старый сигнал с другим сигналом, за исключением 3 полей.

Ответ №1:

Вы можете сделать это в процедурном коде, сначала назначив весь сигнал, а затем назначив отдельные поля, которые вы хотите замаскировать.

 always_comb begin
    new_signal = old_signal;
    new_signal.data    = '0;
end
 

Ответ №2:

Другой способ-использовать «упакованный» вектор для структуры. Если вы знаете свои смещения в структуре, вы можете создать маску. В вашем случае будет работать следующее:

 new_signal = old_signal amp; 12'b111111_0000_11;
------------------------------^^^^^^_----_^^
                              add....data.control