Verilog / vwf中的模拟定义分配方式

问题描述 投票:0回答:1

所以我刚开始使用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

所以我看了一下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

很抱歉这个奇怪的问题...这里只是个初学者。预先非常感谢。

verilog system-verilog modelsim quartus
1个回答
0
投票

我假设第182行是

work i1(

或者可能是

.i1(i1)

指出错误消息提到的原始代码行会有所帮助。

i1中的work i1是实例名称。 Verilog允许从一个模块到另一个模块的层次结构名称引用。请参阅IEEE 1800-2017 LRM中的23.6层次结构名称部分。您可以通过将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)
);

但是通常,信号名称和实例名称看起来如此相似并不是一种好的编码习惯。

© www.soinside.com 2019 - 2024. All rights reserved.