命名端口链接 这种方法需要将例化的模块端口按照名字的对应关系与外部端口链接,端口顺序随意,端口还有两种状态,一种是悬空,就是没有链接,没有找到对应的外部端口,还有就是删除,及不写端口名称。 顺序端口链接 输入端口:与模块化声明不同,输入的端口类型可以是reg类型(上文提过的,reg类型是需要保存数值的,模块声明是不需要这个功能的) 输入输出端口:与模块声明是一样,端口必须是reg类型的。 输出端口:输出端口可以是wire或者reg 悬空端口:正常悬空端口的使用是没有的,所以才会令其悬空,但是在Verilog中,最好不要对悬空端口进行删除,会报错,因为有可能输入有,但是输入端口没有,我这个模块就只是输出一下,不接受任何信息的情况。 位宽端口:FPGA一个硬件层面的,所以在模块例化的情况下,我们需要注意位宽,就像之前进行不同位宽的加减法一样,最后结果的位宽设计,一定要符合规定,所以在例化端口时,如果位宽不一致,不匹配,端口会通过无符号数的右对齐或截断方式进行匹配。 端口连续信号类型 包括五个方面:标识符,位选择,部分选择,多种复合,用于输入端口的表达式。 多模块例化,在多个模块同时例化,需要用generate进行例化,格式如下: genvar i; generate for(i=1;i<=3;i=i+1))begin : adder_gen u_adder1 u_adder2( .Ai (a[i]) , .Bi (b[i]), .Ci (co_temp[i-1]), .So (so[i]), end endgenerate 层次访问 每一个模块例化都有自己的特定的标识符,通过.连接不同层的模块,例如 top.u_input.x_output
verilog带参数例化 当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块,而不用单独为只有参数不同的多个模块在新建文件。参数覆盖有两种方式1.使用关键字,2.带参数值模块例化。 可以用关键字defparam通过模块底层调用的方法来改写低层次模块的参数值。
第二种带参数模块例化,将新的参数值重新写入模块例化,以此来改写原有的module的参数值, 区别 (1)和模块端口实例化一样,带参数例化时,也以不带指定原有参数的名字,按顺序进行参数例化。 (2)利用defparam也可以改写模块在端口声明时声明的参数,利用带参数例化也可以改写模块实体中声明的参数 (3)混合使用
Verilog的函数
函数只能在模块中定义,位置任意,并且在模块中任意地方引用,作用范围也局限此模块。函数主要有以下几个特点 (1)不含任何延迟、时序或时序控制逻辑 (2)至少有一个输入变量 (3)只有一个返回值,且没有输出 (4)不含有非阻塞赋值语句 (5)函数可以调用其他函数,但是不能调用任务 Verilog函数声明格式: function[range-1:0] function_id; input_declaration; other_declaration; procedural_statement; endfunction 在函数声明的时候,会先声明位宽和id,当没有定义位宽,默认是1。 常数函数 常数函数是指在仿真正式开始前,在编译期间就已经计算出结果为常数的函数。常数函数不允许访问全局变量或者调用系统函数,但是可以调用另一个常数函数。 automatic函数 我们所知道局部变量,在调用的时候只是调用他的同一地址,并没有扩建,既两个线程对同一个变量进行操作,会导致竞争行为,使这个变量具有不确定性,所以automatic函数对不同块的调用是不同的,他通过创建新的内存空间,对不同的操作进行层次分类和命名,使用。(通过例子,可以了解到,当涉及递归操作的时候,需要用automatic函数定义变量,不然会导致值的改变,无法实现递归。) (这里有个4位10进制的数字译码器,这里面使用了大量的if嵌套case语句,这也是这种译码控制器的操作方法)
任务
task,在c语言中的理解并没有分这么复杂,任务的功能也是和函数一样,可以用来充当可复用的代码段,在模块中任意被调用。跟函数的功能不一样的地方就是时序逻辑控制上面,除了always语句不能使用,别的时序逻辑都能可以使用。 当子程序出现1.包括时序控制逻辑、例如延迟,事件控制等 2.没有输入变量 3.没有输出或者输出端口大于一。 必须使用任务。 任务说明 任务在模块中任意位置定义,并在模块内任意位置引用,作用范围也局限与此模块。这点和函数一样,没有什么区别。 task task_id(不用写位宽吗)??? endtask 在任务中,需要注意的一点就是使用关键字对端口进行声明,默认把input声明的端口看做wire型,把output类型当做reg类型,不需要在对reg类型进行定义(可以定义,但没必要)这样对output信号赋值时也不要用关键字assign,为了避免时序错乱,建议output信号采用阻塞语句赋值。