Verilog/vwf中仿真定义赋值的方法

Verilog/vwf中仿真定义赋值的方法,verilog,system-verilog,modelsim,quartus,Verilog,System Verilog,Modelsim,Quartus,所以我刚开始使用Quartus II学习Verilog,我一直在创建简单的代码来运行合成和模拟,以适应软件。这段代码实际上来自我正在阅读的文档 我实际上解决了这个问题,但不明白为什么。如果您一直看到代码,则定义了导线i0、i5、i2、i3。i5过去是i1 当我用i1运行模拟时,它会给出这个错误 # Top level modules: # work # Model Technology ModelSim ALTERA vlog 10.1d Compiler 2012.11 Nov 2 2

所以我刚开始使用Quartus II学习Verilog,我一直在创建简单的代码来运行合成和模拟,以适应软件。这段代码实际上来自我正在阅读的文档

我实际上解决了这个问题,但不明白为什么。如果您一直看到代码,则定义了导线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
所以我看了一下练习1.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
对不起,这个奇怪的问题…我只是个初学者。
事先非常感谢。

我想第182行是

work i1(
或者可能是

.i1(i1)
指出错误消息提到的原始代码行会有所帮助

worki1
中的
i1
是一个实例名。Verilog允许从一个模块到另一个模块对名称进行分层引用。参见IEEE 1800-2017 LRM第23.6节层次名称。您可以通过将
worki1
链接到
workw
来解决问题,而不是更改导线和端口名称

还要注意,
工作
中的端口名称不必与实例化模块中的信号名称匹配。您必须在工作中更改端口i1。你也可以这样做:

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

但一般来说,让信号名和实例名看起来如此相似并不是很好的编码实践

与您的问题没有直接关系,但
@(s)
应为
@*
(如果需要符合2001年之前的要求,则应为
@(s或i0或i5或i2或i3)
)。Quartus和其他合成器可能不关心组合灵敏度列表;Verilog模拟器确实很关心,我们现在讨论的代码来自VT文件。vt文件是(我想)在我运行编译时生成的。目前,我不知道如何改变这个链条。这就是为什么我采取了一种简单的方法来改变变量。如果你能告诉我如何更换链条,那就太好了。非常感谢你的帮助