Способ симуляции в Verilog / vwf определяет назначение - PullRequest
0 голосов
/ 24 октября 2019

Итак, я только начал изучать Verilog, используя Quartus II, и я создавал простые коды для запуска синтеза и моделирования, чтобы привыкнуть к программному обеспечению. Этот код фактически взят из документа, который я читаю.

Я на самом деле решил проблему, но не понял почему. Если вы видите код до конца, провода i0, i5, i2, i3 определены. i5 ИСПОЛЬЗУЕТСЯ, чтобы быть i1.

Когда я запустил симуляцию с i1, это выдаст эту ошибку.

 # Top level modules:
 # work
 # Model Technology ModelSim ALTERA vlog 10.1d Compiler 2012.11 Nov  2 2012
 # -- Compiling module work_vlg_sample_tst
 # -- Compiling module work_vlg_check_tst
 # -- Compiling module work_vlg_vec_tst
 # ** Error: Practice1.vt(182): 'i1' already declared in this scope.
 # ** Error: c:/altera/13.0sp1/modelsim_ase/win32aloem/vlog failed.
 # Executing ONERROR command at macro ./Practice1.do line 4

Итак, я взглянул на Practice1.vt, он даст следующее:

*// assign statements (if any)                          
work i1 (
// port map - connection between master ports and signals/registers   
   .i0(i0),
   .i2(i2),
   .i3(i3),
   .i5(i5),
   .s(s),
   .y(y)
);
//*

Почему при моделировании используется i1 для определения этой части выражения? Что делает эта часть кода?

module work(
input wire[1:0] s,
input wire i0, i5, i2, i3,
output reg y
);
always @(s)
begin
    if (s==2'b00)
        y = i0;
    else if (s==2'b01)
        y = i5;
    else if (s==2'b10)
        y = i2;
    else if (s==2'b11)
        y = i3;
    else
        y = y;
end
endmodule

Извините за странный вопрос ... Просто новичок здесь. Заранее большое спасибо.

1 Ответ

1 голос
/ 24 октября 2019

Я предполагаю, что строка 182 была

work i1(

или могла бы быть

.i1(i1)

Было бы полезно указать исходную строку кода, о которой упоминалось в сообщении об ошибке,

i1 в work i1 является именем экземпляра. Verilog позволяет иерархически ссылаться на имена из одного модуля в другой. См. Раздел 23.6 Иерархические имена в IEEE 1800-2017 LRM. Вы могли бы решить вашу проблему по цепочке work i1 на work w вместо изменения имени провода и порта.

Также обратите внимание, что имена портов в work не должны совпадать с сигналомимена в модуле, который создает экземпляры. Вы должны были изменить порт i1 в работе. Вы могли бы также сделать:

work i1 (
// port map - connection between master ports and signals/registers   
   .i0(i0),
   .i2(i2),
   .i3(i3),
   .i1(i5),
   .s(s),
   .y(y)
);

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

...