Перейти к содержанию
    

SystemVerilog - проблемы с квартусом

Может, вопрос не в тему, но чем пользоваться для синтеза?

Пытаюсь синтезировать конструкцию в Quartus II 6.1:

 

interface EngineControllerOutput_if (input logic clk);
    logic chclk;
    logic reset;
    logic direction;
    logic halfstep;
    logic [1:0] sens;
    // 3 2 1 0
    // A B C D
    logic [3:0] phases;
    logic [1:0] inhibit_n;
    
    modport def(
     input     clk, chclk, reset, direction, halfstep, sens,
     output     phases, inhibit_n
        );
    modport test (
     output     chclk, reset, direction, halfstep, sens,
     input     clk, phases, inhibit_n
          );
    
endinterface

module EngineControllerOutput (EngineControllerOutput_if.def ecif);
// бла-бла
endmodule

module EngineController_AvalonSlave_Full
    #(
     parameter MSB = 31
      )
    (
     input bit i_Clk,
     input bit i_Reset_n,
     input bit i_Clk2,
     input bit i_ChClk,
     input bit i_ChipSelect,
     input bit [1:0] i_Address,
     input bit i_Write,
     input bit [MSB:0] i_WriteData,
     input bit i_Read,
     input bit i_LeftLimit,
     input bit i_RightLimit,
     input bit [1:0] i_Sens,
     output bit [MSB:0] o_ReadData,
     output bit o_Irq,
     output bit [3:0] o_Phases,
     output bit [1:0] o_Inhibit_n
     );

    bit o_Clk;
    bit o_Reset;
    bit o_Half;
    bit o_CW;

    EngineControllerOutput_if ecif (o_Clk);
    EngineControllerOutput eng1 (ecif); // вот здесь выдает: Error (10828): SystemVerilog error at EngineControllerFull.v(35): expression has 10 elements; expected 
EngineController_AvalonSlave  #(.MSB(MSB)) avslv1
    (i_Clk, i_Reset_n, i_Clk2, i_ChipSelect, i_Address, i_Write, i_WriteData, i_Read, i_LeftLimit, i_RightLimit,
     o_ReadData, o_Irq, o_Clk, o_Reset, o_Half, o_CW);
    assign o_Phases = ecif.phases;
    assign o_Inhibit_n = ecif.inhibit_n;
    
    assign ecif.test.chclk = i_ChClk;
    assign ecif.test.sens = i_Sens;
    assign ecif.test.reset = o_Reset;
    assign ecif.test.direction = o_CW;
    assign ecif.test.halfstep = o_Half;

endmodule // EngineController_AvalonSlave_Full

 

Если там поставить ecif.def, то варнинг исчезает, но появляется сообщение про несколько источников сигнала на одном входе. Если в assign ниже добавить test (как в исходнике) - то собирается, однако при просмотре в RTL Viewer видим какую-то чушь: блок ecif интерфейса, у него есть входы ecif.test, выходы ecif.def и двунаправленные выходы ecif.... бред.

Я не пойму как писать.

В ModelSim компилируется без проблем. :angry2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может не в этом дело, но в модуле EngineController_AvalonSlave_Full вы делаете инстанс интерфейса

почему вы тогда обращаетесь к нему в этом же модули используя спецификаторы модпортов

assign ecif.test.chclk = ??

 

EngineControllerOutput eng1 (ecif); // вот здесь выдает: Error (10828): SystemVerilog error at EngineControllerFull.v(35): expression has 10 elements; expected

а здесь полностью сообщение об ошибке приведите плз (подозреваю что expected 8?)

скорее всего он не может динамически связать тип модпорта - пишите явно тип модпорта когда объявляете связывание портов в инстансе модуля

т.е.

module some_module (interface_name.modeport_name internal_interface_instance_name);

endmodule

module xx();

interface_name interface_instance;

some_module some_module_instance(interface_instance);

endmodule

так можно - он динамически должен определить какой модпорт выбирать , но наверное компилятор не додумывает -- пишите явно :

module some_module (interface_name internal_interface_instance_name);

endmodule

module xx();

interface_name interface_instance;

some_module some_module_instance(interface_instance.modeport_name);

endmodule

есть ещё вариант что квартус с модпортами просто не дружит, хотя тогда он должен был бы выдать сообщение еще при компиляции интерфейса :cranky:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может не в этом дело, но в модуле EngineController_AvalonSlave_Full вы делаете инстанс интерфейса

почему вы тогда обращаетесь к нему в этом же модули используя спецификаторы модпортов

assign ecif.test.chclk = ??

 

Потому что без спецификатора квартус говорит, следующее:

 

module EngineController_AvalonSlave_Full
    #(parameter MSB = 31)
    (input bit i_Clk,  input bit i_Reset_n,  input bit i_Clk2, input bit i_ChClk, input bit i_ChipSelect, input bit [1:0] i_Address,
     input bit i_Write, input bit [MSB:0] i_WriteData, input bit i_Read, input bit i_LeftLimit,
     input bit i_RightLimit,  input bit [1:0] i_Sens, output bit [MSB:0] o_ReadData, output bit o_Irq,
     output bit [3:0] o_Phases, output bit [1:0] o_Inhibit_n
     );

    wire o_Clk;   wire o_Reset;    wire o_Half;    wire o_CW;

    EngineControllerOutput_if ecif (o_Clk);
    EngineController_AvalonSlave  #(.MSB(MSB)) avslv1
    (i_Clk, i_Reset_n, i_Clk2, i_ChipSelect, i_Address, i_Write, i_WriteData, i_Read, i_LeftLimit, i_RightLimit, o_ReadData, o_Irq, o_Clk, o_Reset, o_Half, o_CW);
    EngineControllerOutput eng1 (ecif.def);    
    assign o_Phases = ecif.phases;
    assign o_Inhibit_n = ecif.inhibit_n;    
    assign ecif.chclk = i_ChClk;
    assign ecif.sens = i_Sens;
    assign ecif.reset = o_Reset;
    assign ecif.direction = o_CW;
    assign ecif.halfstep = o_Half;    
endmodule // EngineController_AvalonSlave_Full

 

Warning (10030): Net "ecif.test.chclk" at EngineControllerFull.sv(52) has no driver or initial value, using a default initial value 0

и еще про reset, direction, halfstep, sens[0], sens[1]

 

Все решилось явным указанием модпорта:

    assign o_Phases = ecif.test.phases;
    assign o_Inhibit_n = ecif.test.inhibit_n;
    
    assign ecif.test.chclk = i_ChClk;
    assign ecif.test.sens = i_Sens;
    assign ecif.test.reset = o_Reset;
    assign ecif.test.direction = o_CW;
    assign ecif.test.halfstep = o_Half;

И если в ситуации с assign это еще понятно, то зачем указывать модпорт при связывании интерфейса и модуля, использующего этот интерфейс - непонятно. Похоже, квартус просто не смотрит на спецификацию модуля и его порты. :angry2:

Вывод:

он динамически должен определить какой модпорт выбирать , но наверное компилятор не додумывает -- пишите явно

 

При этом спецификация тоже получается дурная: ведь модпорт test предполагает входы для phases и inhibit_n и выходы для остальных, значит, в теории, в assign должно указываться ecif.def, а не ecif.test.

Результат, полученный для ecif.test в WithExplicitModportSpecification.png.

Для

assign ecif.def.chclk = i_ChClk;

получаем Error (10231): Verilog HDL error at EngineControllerFull.sv(67): value cannot be assigned to input "chclk"...... :maniac:

post-7038-1175583775_thumb.jpg

Изменено пользователем DukeXar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продолжаем эпопею с интерфейсами.

 

module EngineControllerOutput (EngineControllerOutput_if.def ecif);
    bit [2:0] state;
    bit [1:0] chop; // строка 81
    bit [3:0] phases;

    assign    ecif.inhibit_n = { chop[1] & (phases[3] | phases[2]), chop[0] & (phases[1] | phases[0]) };

    always @(posedge ecif.chclk or posedge ecif.sens[0]) begin
    if (ecif.sens[0])
        chop[0] <= 0;
    else
        chop[0] <= 1;
    end

    always @(posedge ecif.sens[1]) begin
    if (ecif.sens[1])  // строка 96
        chop[1] <= 0;
    //else
    //    chop[1] <= 1;
    end   

    assign ecif.phases = phases;

 

Квартус говорит:

Warning (10235): Verilog HDL Always Construct warning at EngineControllerOutput.sv(96): variable "ecif" is read inside the Always Construct but isn't in the Always Construct's Event Control

Warning (10030): Net "chop[1]" at EngineControllerOutput.sv(81) has no driver or initial value, using a default initial value 0

Warning (10030): Net "chop[0]" at EngineControllerOutput.sv(81) has no driver or initial value, using a default initial value 0 :cranky:

 

Как быть? :help:

Похоже, я выкину СВ и вернусь обратно на верилог. :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если вы такой категоричный - то выкиньте квартус. я синтезирую в прецижене - и никаких проблем пока не было (за исключением небольшим). а лучше подождите пока они разберутся с интерфейсами - в любой программе бывают баги. СВ то здесь при каких делах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

=) Вот, я как раз хотел узнать, в чем же еще можно синтезировать на СВ.

Я не противник СВ, даже наоборот, просто сейчас не могу его использовать, кроме как для моделирования. ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если вы такой категоричный - то выкиньте квартус. я синтезирую в прецижене - и никаких проблем пока не было (за исключением небольшим).

Тут, сожалению, тоже есть вопросы - как-то меньше он у нас распространен (по сравнению с тем же синплифаем), обновления идут редко. Например, версия, лежащая в настоящее время на фтп, не поддерживает Cyclone II, который является на данный момент самым реальным из недорогих альтеровских FPGA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы меня прямо огорчили, у меня как-раз Cyclone II.

А что еще существует для синтеза SystemVerilog и как обстоят дела с этим в квартусе 7? На сайте альтеры никаких толковых упоминаний... как всегда: initial support.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если речь о прецижне - то все он держит - у мене вот еще древняя версия 2006a.92 от 11 октября 2006 года - есть там c2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если речь о прецижне - то все он держит - у мене вот еще древняя версия 2006a.92 от 11 октября 2006 года - есть там c2.

Да, точно, прогнал, где-то не там посмотрел. В списке есть C2, прошу прощения за дезу. :blush: Правда, там только представлены варианты с буквой С на конце. Хотя на синтез это влиять не должно, спидгрейды, вроде, все есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...