Установка переменных модулей - PullRequest
0 голосов
/ 20 июня 2020

Я работаю над проектом и хотел бы реализовать создание экземпляров модуля переменных, если это возможно. Это пример из моего проекта, в котором я создаю массив модулей умножения, которые я разработал. Чтобы изменить типы данных (т.е. целое число-> плавающая точка-> фиксированная точка), мне нужно изменить вызываемый мной модуль. Есть ли способ легко это сделать, изменив мой код? Я пробовал поискать и, похоже, мне не повезло с ответами.

Я не уверен, насколько это важно, но я пишу свой код в Vivado 2019.2 для Pynq-Z2.

Мой старый код:

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        integercomputeBlockPynq m_computeBlock_in(i/o assign);
    end
endgenerate

Ответы [ 3 ]

2 голосов
/ 22 июня 2020

На мой взгляд, следующий код выглядел бы немного лаконичным и более читабельным, поскольку он имеет только один l oop. Однако это зависит от вас.

Но одна вещь заключается в том, что ваши if условия немного перекрываются, поэтому я подумал, что следующее отразит их немного лучше.

Теперь, здесь лучше использовать параметры вместо макросов. Есть как минимум 2 причины:

  1. параметры ограничены и принадлежат, вы избежите возможных конфликтов глобального пространства, если сделаете это.

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

Итак, вот мой пример:

parameter isInt=1; // i guess, if it is not int, it is float
parameter isFixed=0;
parameter inputPortCount = 4; // or whatever number.
 
generate
    genvar m ;
        for(m=0;m<inputPortCount;m=m+1) begin: loop
           if (isFixed)
               floatcomputeBlock m_computeBlock_in(i/o assign);
           else if (isInt)
               integercomputeBlockPynq m_computeBlock_in(i/o assign);
           else 
               floatcomputeBlockPynq m_computeBlock_in(i/o assign);
         end
endgenerate
0 голосов
/ 21 июня 2020

Следуя шаблону Имя модуля переменной System Verilog , должна быть возможна немного более элегантная версия: `define MODE_INT

`ifdef MODE_INT
    `define module_name integercomputeBlockPynq 
`elsif MODE_FLOAT
    `define module_name floatcomputeBlockPynq 
`elsif MODE_FIXED
    `define module_name floatcomputeBlock 
`endif

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        `module_name m_computeBlock_in(1'b1);
    end
endgenerate

К сожалению, verilog не может" если определено " (mode == 'int') "

0 голосов
/ 21 июня 2020

Мой недавно реализованный код:

`define int     1
`define float   0
`define fixed   0
generate
    genvar m ;
    if(`int&&!(`float||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            integercomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`float&&!(`int||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`fixed&&!(`int||`float))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlock m_computeBlock_in(i/o assign);
        end
    end
endgenerate

В основном я просто добавил несколько флагов и использовал операторы if, которые обрабатывают эти флаги, чтобы входить только в том случае, если один из установлено три. Не уверен, что это мое окончательное решение, но пока позвольте моему коду работать. Еще раз спасибо Christian B.

...