学习接口的时候,就对接口信号线,内部信号线,还有矢量,线网类型等概念似懂非懂。最开始感觉懂了,学到一段时间之后,就迷糊了。
因此在这里总结记录捋一下,自己对信号线,接口等概念的理解。
答:我们是做验证,对DUT这个RTL代码(verilog书写的.v文件)进行搭建验证测试平台。DUT一般是指verilog语言写的设计代码,指的是这个模块功能的设计结构。
RTL代码需要“画”出输入输出端口,各级寄存器,寄存器之间的组合逻辑和前三者之间的连接。对于组合逻辑,只需要软件级描述,将其功能包装在“黑匣子”中即可,无需考虑其门级结构。
input在真实的设计环境里,来自于外部的设计,对我们的DUT进行连接,输入数据进入DUT部分。
output则是自DUT输出到外部的设计中,也可以说成是DUT响应外部的设计模块。
但在验证结构中,我们的任务就是搭建测试环境,给DUT搭建它在真实设计中所需要嵌入的模块,由我们来模拟。
故input信号,来自于我们发送的激励源,output信号最终也是被我们的验证模块接收。
数据传输:分为标准总线数据传输,比如AMBA总线,一开始是ARM公司内部的协议规范,到后来整个行业都在follow它的协议,那么它就成了一个标准的协议规范了。这叫做标准总线的数据传输。
传输数据在芯片里面是非常重要的环节:芯片处理数据无外乎做了两件事情,一个是数据的运算,一个是数据的传输。数据运算完之后,就需要进行传输,从一个模块传输到另一个模块。
那么我们传输数据就需要一个数据总线,用来规范数据传输的规则,就像马路上飞驰的汽车。比如需要把汽车从家运到公司,再运送到学校,中间的交通规则: 比如红绿灯,斑马线,双黄线等就是运送过程所要求的传输规则。就像需要把你正在WORD里敲下的数据从键盘模块→输入端口→主板→CPU→内存里存起来,下次关开机之后又可以从内存里读出这段话。
而我们MCDF之类的项目,用的数据总线,则是非标准的。因为标准总线的信号非常复杂,我们的总线可以称作自定义的总线,或者叫local bus。总之就相当于交通规则我们不那么按照正规法律来,我们传输的一辆车遇到路口红绿灯是否要停,是否可以并线超车等等都可以我们自己来制定,最终目标能够把我们的车传输到目的地就可以,至于别人是否要遵守跟我一样的交通规则,我们暂时不关心。这就是非标准总线传输。
那么就可以理解一下信号线的目的了:
input [31:0] chnl_data_in; // 数据传输进来的数据线,顾名思义,写代码时要注意变量命名尽量做到见名知义。同时要注意,这里的[31:0],意思是这条线是由32根线组成,目的是为了足够表示数据值,因为数据在这里是32位的,一根线在计算机里只能有通电和不通电两种状态,或者也可以说是拉高/不拉高,或者表示为1/0,而32位的数据通常是由寄存器储存的,可能有32个D触发器之类的。
//当我的数据需要储存时,我就放在[31:0]的寄存器这个器件里,当我需要把A模块a寄存器中的32位 数据,传输到B模块b寄存器中,中间的连接部分就需要准备32根线:wire[31:0],区别于寄存器定义时的reg [31:0]。第一次学习的时候总是搞混。
input chnl_valid_in; // 对当前数据是否是有效写入的信号线,表示当前数据是否有效写入的一种状态。
output chnl_ready_out; // 输出信号线或者说响应信号线,表示当前DUT是否准备好了接收数据的一种状态。某种程度上,这也是一种握手行为。
output [5:0] chnl_margin_out; // 同样是输出信号线,只不过它是6位的,简单理解为一捆信号线有6根,则这捆信号线可以与[5:0]的寄存器相连了。传输6bit的数据。
……
依此类推,初学的时候,对向量,线网类型,和寄存器类型,总容易搞混。学的多了,理解总有误。