verilog端口,sv端口,sv接口和modport

目录

1.verilog端口

1.1 verilog端口声明

1.2 verilog端口的连接

2. sv端口

 3.sv接口和modport

 3.1 sv接口总结

3.2 modport的定义和使用

3.2.1 modport定义

3.2.2 modport的使用


1.verilog端口

1.1 verilog端口声明

module count ( inout wire[31:0] data,
               output reg[31:0] result,
               output reg co,
               input [31:0] a,b
               iput tril ci);
...
endmodule

//verilog里端口的名称,方向,位数和类型都可以在端口列表声明
//也可以在端口列表只声明端口名称,在module内声明方向,位宽和类型
//若没有显式声明端口类型,则默认wire类型;默认位宽为类型的默认位宽
//上例中,a,b默认类型为wire,co的位宽为1
//为避免诸多不必要的麻烦,声明端口时,尽量名称+方向+位宽+类型一并声明

一些限制:所有端口必须显式声明方向;必须重新指定端口方向,才能改变后面端口类型;必须重新指定端口方向和类型,才能改变后面的端口位宽。

1.2 verilog端口的连接

//位置对应方式连接
module and_1( a,b,c);
input a,b;
output c;
assign c=a&b;
endmodule

module logic(in1,in2,q);
inpu in1,in2;
output q;
and_1 U1 (in1,in2,q);       //按顺序,a连in1,b连in2,c连q
endmodule

//端口对应方式连接
module and_1( ..)
..
endmodule

module logic(..);
..
and_1 U1(.a(in1),.b(in2),.c(q)); //按位置,a连in1,b连in2,c连q
                                 //.选择底层模块的端口,后面()里是连接的顶层模块端口
endmodule                        //用这种方法可以不按顺序写

2. sv端口

sv的端口在verilog端口基础上做了一些延伸扩展:

指定了缺省方向为inout;端口列表中下一个端口定义了类型但没有方向,则方向参照前一个端口。

需要注意:如果第一个端口既没有方向也没有类型,那么后面的所有端口都不能有方向和类型。

可以理解为此时端口列表只声明端口名称,方向和类型都在模块内声明。

 3.sv接口和modport

 3.1 sv接口总结

 以上图为例,如果要完成这样一个结构的连接,可以预想到的是,main_bus中的信号需要分别在六个模块中声明,然后再与六个模块相连接,同样的信号需要被重复声明和连接六次,这样代码量十分冗余。

sv中引入接口,接口可以允许许多信号合成一组由一个端口表示,即接口类型的端口。

上例中,使用verilog编写的测试生成器代码如下:

模块定义:

模块例化连接连接:

可以看出,main_bus在模块中要声明一次,连接时又要声明一次。

sv接口中,将main_bus信号包裹在interface和endinterface中,集中声明然后重复使用。

interface声明如下:

 

用sv接口来简化后的测试生成器代码如下:

模块定义:

 模块例化连接:

 模块定义中的main_bus bus,bus是接口类型的端口main_bus的名称,模块例化连接中的.bus(bus)里的(bus)是在顶层模块中例化的main_bus的实例名。具体理解见下 

//显式声明一个接口类型的端口
interface chip_bus;
...
endinterface

module ram (chip_bus pins, input clock); 
//在verilog学习后,刚接触sv接口总是想写成“方向+类型+名称”,比如 input logic[3:0] abc;
//这里,chip_bus已经是一个interface类型,
//且interface类型本身就可以具有input,output或者inout方向
//可以理解成chip_bus本身已经包括方向+类型,而pins就是变量名称
..
endmodule

//隐式声明一个接口类型端口
interface chip_bus;
...
endinterface

module arm (interface pins, input clock);
//参照上例,“方向+类型+名称”,明显没有声明“方向+类型”,而是用interface代替,名字为pins;
//这里只是举例隐式声明的方法,但个人来看,在实际应用中,interface的定义不止一个,
//如果都用隐式声明,个人理解会有不妥,所以实际编写代码,应该显式声明最稳妥

3.2 modport的定义和使用

3.2.1 modport定义

接口中的信号并未规定方向,对于不同的模块来说,接口中的信号方向会有不同。modport就定义了从不同的模块角度来看接口中信号的方向。

 可以看出,modport中只需要定义信号对于不同模块的方向,而类型和位宽在接口中声明即可。

3.2.2 modport的使用

//在例化时选择modport
interface chip_bus(input logic clock,restn);
modport master (); //接口中相对于master的信号及方向
modport slave ();  //接口中相对于slave的信号及方向
endinterface

module primary (chip_bus pins);
..
endmodule

module secondary (chip_bus pins);
..
endmodule

module chip (input logic clock,restn);
 chip_bus bus (clock,resetn); //连接接口前一定要例化接口
 primary i1 (bus.master); //例化primary时选择连接bus中的modport master
 secondary i2 (bus.slave); //例化secondary时选择连接bus中的modport slave
endmodule

定义端口时就选择连接的modport

//端口定义时就选择连接的modport
interface chip_bus (input logic clock,resetn);
modport master (..);
modport slave (..);
endinterface

module primary (chip_bus.master); //这里有点像是用例化的名称去索引包含的对象,但从后面来看
                                  //chip_bus此时并没例化,而且例化名称是bus
                                  //这里就记为接口中modport使用的一个专门用法
..
endmodule

module secondary (chip_bus.slave);
..
endmodule

module chip (input logic clock,resetn);
chip_bus bus (clock,resetn);
primary i1 (bus); //会连接到bus中的master
secondary i2 (bus); //会连接到bus中的slave
endmodule

一些个人理解和总结:

interface my_intf (..);
..
endinterface

module abc (my_intf intf);//接口类型端口,名称为intf
..
endmodule

module top (..);

my_intf intf (..);//例化名称为intf
abc U1 (.*)
..
endmodule

//此时例化名称和模块内端口名称相同,连接时可用.*自动连接
//如果不同,则用.索引端口再连接

注意:

1.如果一个模块端口列表中有接口类型的端口,那么这个端口必须被连接到接口实例或者其它接口类型端口

2.显式声明的接口类型端口,必须连接到同一类型接口实例

3.隐式声明的接口类型端口,可以连接到任何类型接口实例

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Verilog是一种硬件描述语言,用于编写数字电路的模型和设计。.sv文件是Verilog文件的扩展名,用于存储Verilog代码。 Verilog是一种像C语言的文本语言,在工程师和设计者之间非常流行。它可用于描述数字逻辑、存储器、控制单元、以及其他电子系统的行为。通过使用Verilog,设计者可以创建高层次的设计,并将其转换为实现在FPGA、ASIC等硬件上的形式。 .sv文件是存储Verilog代码的文件。它通常包含模块定义、端口声明、内部信号定义和时序逻辑等内容。在.sv文件中,设计者可以定义模块的行为,并描述其在特定输入条件下的输出。.sv文件也包含了各种硬件原语和逻辑门的描述,供设计者使用。 在.sv文件中,设计者可以使用各种建模技术来模拟硬件电路的功能。这些技术包括行为建模、结构建模和数据流建模等。行为建模描述了模块的逻辑行为,它定义了在不同输入条件下模块的输出。结构建模描述了模块的组成结构,例如使用逻辑门和触发器等。数据流建模描述了数据的流动和操作,它定义了模块的数据传输和处理。 通过编写Verilog代码并保存为.sv文件,设计者可以使用EDA(Electronic Design Automation)工具将其合成为实际的硬件电路。设计者还可以使用仿真工具,如ModelSim和Xilinx Vivado等,对Verilog代码进行验证和调试。.sv文件是实现硬件设计的关键文件,它提供了一种有效的方式来编写和管理Verilog代码。 ### 回答2: Verilog .sv文件是指Verilog硬件描述语言(HDL)的源代码文件,其中包含了用于描述数字电路行为和结构的语句和模块定义。 Verilog是一种硬件描述语言,它以模块化的方式描述数字电路,可以用于设计各种不同的电子系统,例如处理器、ASIC、FPGA、芯片等。.sv文件是一种常见的Verilog代码文件格式,以.sv为文件扩展名。 一个典型的.sv文件由以下几个部分组成: 1. 模块定义:.sv文件通常包含了一个或多个模块定义。模块是Verilog代码的基本单元,用于描述电路的行为或结构。每个模块都有一个唯一的名字和输入输出端口。 2. 输入输出定义:在模块定义中,会声明输入输出端口,它们定义了模块与其他模块或外部环境之间的接口。输入输出端口可以是信号线、寄存器或者其他符号。 3. 内部信号定义:在模块内部,可以定义内部信号来辅助实现电路功能。内部信号可以是寄存器、线网或者是其他变量。 4. 语句和逻辑:.sv文件中的语句用于描述电路的行为,可以包括逻辑操作、条件语句、循环语句、复位和时钟控制、以及其他硬件描述语言的特性。 5. 子模块实例化:在.sv文件中,可以实例化和连接其他模块以构建复杂的电路。这些子模块可以是已有的标准模块,也可以是自定义的模块。 6. 模块层次结构:.sv文件可以通过模块的层次结构来组织代码,使其更加清晰和易读。 总的来说,Verilog .sv文件为设计人员提供了一种描述数字电路的方式,通过定义模块、输入输出端口以及内部信号,并编写相应的逻辑和语句,可以实现各种电子系统的功能。 ### 回答3: Verilog是一种硬件描述语言,主要用于描述数字逻辑电路的结构和行为。.sv文件是Verilog源代码文件的一种常见扩展名。 在Verilog .sv文件中,我们可以使用模块的层次结构来描述数字逻辑电路。一个模块可以包含其他模块或基本的逻辑元件,如与门、或门、非门等。每个模块可以具有输入端口和输出端口,用于与外部环境或其他模块进行信号交互。 在.sv文件中,我们可以使用关键字“module”声明一个模块,并指定模块的输入和输出端口。我们可以给模块起一个名字,并在模块的内部定义逻辑结构。 在模块内部,我们可以使用关键字“input”和“output”定义输入和输出端口。同时,我们还可以使用“wire”或“reg”关键字定义内部信号或寄存器。我们可以使用逻辑门和其他模块来连接这些内部信号。 在.sv文件中,我们可以使用“assign”关键字来连接信号和端口。我们可以使用逻辑运算符(如与、或、非等)或位运算符(如位与、位或、位异或等)来定义各个信号之间的逻辑关系。 除了模块的层次结构和逻辑描述,.sv文件还可以包含一些其他的属性定义和约束条件。我们可以使用“parameter”关键字定义一些常量值,以便在整个设计中进行重用。我们还可以使用“always”关键字定义一个always块,用于描述时序逻辑和状态机的行为。 总之,Verilog .sv文件是用于描述数字逻辑电路的一种源代码文件。它可以帮助工程师们对电路进行建模、仿真和综合。通过Verilog .sv文件,我们可以清晰地描述电路的结构和行为,从而实现对电路的设计和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值