DukeXar 0 2 апреля, 2007 Опубликовано 2 апреля, 2007 · Жалоба Может, вопрос не в тему, но чем пользоваться для синтеза? Пытаюсь синтезировать конструкцию в 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 2 апреля, 2007 Опубликовано 2 апреля, 2007 · Жалоба может не в этом дело, но в модуле 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DukeXar 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 (изменено) · Жалоба может не в этом дело, но в модуле 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: Изменено 3 апреля, 2007 пользователем DukeXar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DukeXar 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Продолжаем эпопею с интерфейсами. 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: Как быть? Похоже, я выкину СВ и вернусь обратно на верилог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба если вы такой категоричный - то выкиньте квартус. я синтезирую в прецижене - и никаких проблем пока не было (за исключением небольшим). а лучше подождите пока они разберутся с интерфейсами - в любой программе бывают баги. СВ то здесь при каких делах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DukeXar 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба =) Вот, я как раз хотел узнать, в чем же еще можно синтезировать на СВ. Я не противник СВ, даже наоборот, просто сейчас не могу его использовать, кроме как для моделирования. ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба если вы такой категоричный - то выкиньте квартус. я синтезирую в прецижене - и никаких проблем пока не было (за исключением небольшим). Тут, сожалению, тоже есть вопросы - как-то меньше он у нас распространен (по сравнению с тем же синплифаем), обновления идут редко. Например, версия, лежащая в настоящее время на фтп, не поддерживает Cyclone II, который является на данный момент самым реальным из недорогих альтеровских FPGA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DukeXar 0 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба Вы меня прямо огорчили, у меня как-раз Cyclone II. А что еще существует для синтеза SystemVerilog и как обстоят дела с этим в квартусе 7? На сайте альтеры никаких толковых упоминаний... как всегда: initial support. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harbour 0 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба Если речь о прецижне - то все он держит - у мене вот еще древняя версия 2006a.92 от 11 октября 2006 года - есть там c2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба Если речь о прецижне - то все он держит - у мене вот еще древняя версия 2006a.92 от 11 октября 2006 года - есть там c2. Да, точно, прогнал, где-то не там посмотрел. В списке есть C2, прошу прощения за дезу. Правда, там только представлены варианты с буквой С на конце. Хотя на синтез это влиять не должно, спидгрейды, вроде, все есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться