Как привести макрос с помощью оператора потоковой передачи

  • У меня есть макросы 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
Примечание. Код хорошо моделирует, а также хорошо встраивается в FPGA Xilinx с использованием Vivado.
Следующее не работает:

$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]}}))

ошибка вышла.

Вам нужно предоставить нам пример, показывающий все задействованные типы данных и то, какими вы хотите видеть результаты.

dave_59 10.04.2024 16:46

Спасибо, Дэйв, добавил. Надеюсь, теперь информация полная.

user21700525 10.04.2024 17:01

Недостаточно. Нужен пример с результатами. минимальные, полные воспроизводимые примеры. Сосредоточьтесь на том, какой код должен создавать макрос, а не на самом макросе.

dave_59 10.04.2024 17:09

Теперь лучше? это автономно.

user21700525 10.04.2024 18:33

Работает даже с макросами. Я просто пытаюсь убрать новые предупреждения.

user21700525 10.04.2024 18:51

Да, макросы были такими же, как я делал раньше. Теперь я сменил симулятор на Questa и получил предупреждения. Уточню - при написании явно или при использовании макроса в Modelsim DE 2022.4 предупреждений нет, но в Questa предупреждения появляются.

user21700525 11.04.2024 17:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, почему вы получаете сообщение об ошибке, но приведение к размеру не является необходимым для кода, который вы показываете, и его удаление избавит вас от предупреждающего сообщения.

Вот что я имею в виду под полным работоспособным примером:

`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, но я уже это знал)

user21700525 11.04.2024 20:24

Другие вопросы по теме