У меня есть макросы Systemverilog для анализа распакованных данных с учетом порядка байтов:
Цель этого макроса — взять любые байты BYTE_WIDTH из смещения BYTE_OFFSET в массиве байтов и упаковать их в вектор.
Я без проблем запускал более старую версию Modelsim. Недавно я обновил симулятор до обновленной версии Questa Base и начал получать это предупреждение для файлов, вызывающих этот макрос, хотя функциональность правильная.
Есть ли правильный способ написать это как макрос?
example.sv
):`define PARSE_LITTLE_ENDIAN(TARGET, SOURCE, BYTE_OFFSET, BYTE_WIDTH) \
TARGET = $size(TARGET)'({<<8{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}})
`define PARSE_BIG_ENDIAN(TARGET, SOURCE, BYTE_OFFSET, BYTE_WIDTH) \
TARGET = $size(TARGET)'({>>8{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}})
class my_parser;
bit [64-1:0] body_len;
logic[8-1:0] frame_buffer[];
function void call_macro();
this.frame_buffer = new[10];
for (int byte_idx = 0; byte_idx < this.frame_buffer.size(); byte_idx++)
begin
this.frame_buffer[byte_idx] = $urandom();
end
`PARSE_LITTLE_ENDIAN(this.body_len, this.frame_buffer, 2, 8);
`PARSE_BIG_ENDIAN(this.body_len, this.frame_buffer, 2, 8);
endfunction
endclass
vlog -sv example.sv
Questa Base Edition-64 vlog 2024.1 Compiler 2024.02 Feb 1 2024
Start time: 11:26:42 on Apr 10,2024
vlog -sv example.sv
-- Compiling package example_sv_unit
** Warning: example.sv(21): (vlog-2960) Streaming concatenation shall not be used as an operand in an expression without first casting it to a bit-stream type.
** Warning: example.sv(22): (vlog-2960) Streaming concatenation shall not be used as an operand in an expression without first casting it to a bit-stream type.
Top level modules:
--none--
End time: 11:26:42 on Apr 10,2024, Elapsed time: 0:00:00
Errors: 0, Warnings: 2
$cast(TARGET,{<<BYTE{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}})
дает то же предупреждение.
И
TARGET = $size(TARGET)'($type(TARGET)'({<<BYTE{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}}))
или
TARGET = $type(TARGET)'($size(TARGET)'({<<BYTE{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}}))
ошибка вышла.
Спасибо, Дэйв, добавил. Надеюсь, теперь информация полная.
Недостаточно. Нужен пример с результатами. минимальные, полные воспроизводимые примеры. Сосредоточьтесь на том, какой код должен создавать макрос, а не на самом макросе.
Теперь лучше? это автономно.
Работает даже с макросами. Я просто пытаюсь убрать новые предупреждения.
Да, макросы были такими же, как я делал раньше. Теперь я сменил симулятор на Questa и получил предупреждения. Уточню - при написании явно или при использовании макроса в Modelsim DE 2022.4 предупреждений нет, но в Questa предупреждения появляются.
Я не уверен, почему вы получаете сообщение об ошибке, но приведение к размеру не является необходимым для кода, который вы показываете, и его удаление избавит вас от предупреждающего сообщения.
Вот что я имею в виду под полным работоспособным примером:
`define PARSE_LITTLE_ENDIAN(TARGET, SOURCE, BYTE_OFFSET, BYTE_WIDTH) \
TARGET = {<<8{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}}
`define PARSE_BIG_ENDIAN(TARGET, SOURCE, BYTE_OFFSET, BYTE_WIDTH) \
TARGET = {>>8{SOURCE[BYTE_OFFSET +: BYTE_WIDTH]}}
class my_parser;
bit [64-1:0] body_len;
logic[8-1:0] frame_buffer[];
function void call_macro();
this.frame_buffer = new[10];
void'(randomize(frame_buffer));
$displayh("%p",frame_buffer);
`PARSE_LITTLE_ENDIAN(this.body_len, this.frame_buffer, 2, 8);
$displayh(body_len);
`PARSE_BIG_ENDIAN(this.body_len, this.frame_buffer, 2, 8);
$displayh(body_len);
endfunction
endclass
module top;
my_parser p = new;
initial p.call_macro();
endmodule
Спасибо! (Кстати, моя лицензия на инструмент не поддерживает функцию randomize
, но я уже это знал)
Вам нужно предоставить нам пример, показывающий все задействованные типы данных и то, какими вы хотите видеть результаты.