verilog - Verilog/vwf中模拟定义赋值的方式
问题描述
所以我刚开始使用 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
抱歉这个奇怪的问题......这里只是一个初学者。非常感谢您提前。
解决方案
我假设第 182 行是
work i1(
或者它可能是
.i1(i1)
指出错误消息提到的原始代码行会有所帮助。
i1
inwork 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)
);
但一般来说,让信号名称和实例名称看起来如此相似并不是一个好的编码习惯。
推荐阅读
- python - 为什么 matplotlib 会为我绘制叠加旧图形的新图形?
- angular - Express 服务器未部署 Angular 8 应用程序
- email - 无法从 GCP 主机发送电子邮件
- android - 我的全屏应用程序在杀死它并重新启动后切换到较低的分辨率
- c# - 无法加载文件或程序集“System.Diagnostics.StackTrace”或其依赖项之一
- jquery - 如何为特定列上的每个表格单元格使用 Jquery Mask Money?
- python - 如何在 or-tools 中定义复杂的目标函数?
- php - 通过 SSL 循环调用 PHP 文件的问题
- r - 根据行中的另一个变量删除具有相同值的行
- r - r 每个网格单元区域的栅格统计数据