module 和 endmodule 中间放置定义。 有输入与输出,以及直接的逻辑,如下:
module adder ( count,sum,a,b,cin );
input [2:0] a,b; input cin; output count; output [2:0] sum;
assign {count,sum}=a+b+cin; endmodule
module compare ( equal,a,b );
output equal; //声明输出信号equal input [1:0] a,b; //声明输入信号a,b assign equal=(a==b)?1:0;
/*如果两个输入信号相等,输出为1。否则为0*/ endmodule
module trist2(out,in,enable); output out; input in, enable;
bufif1 mybuf(out,in,enable); Endmodule
module trist1(out,in,enable);
output out; input in, enable;
mytri tri_inst(out,in,enable); endmodule
module mytri(out,in,enable); output out; input in, enable;
assign out = enable? In : 'bz; endmodule
测试模块常见的形式: module t;
reg „; //被测模块输入/输出变量类型定义 wire„; //被测模块输入/输出变量类型定义 initial begin „; „; „; end „ „//产生测试信号 always #delay begin „; end „ „//产生测试信号
Testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) ); //被测模块的实例引用
initial begin „.; „.; „. end //记录输出和响应 endmodule module t; reg a, b, sel; wire out; //引用多路器实例 mux2_m (out, a, b, sel); //加入激励信号
initial begin a=0; b=1; sel=0; #10 b=0; #10 b=1; sel=1; #10 a=1; #10 $stop; end initial begin
$monitor ($time, , “out=%b a=%b sel=%b”, out,a,b,sel);
End
在initial 块中,用系统任务$time 和 $monitor
$dumpfile(“file.dump”); //打开记录数据变化的数据文件 $dumpvars(); //选择需要记录的变量 $dumpflush; //把记录在数据文件中的资料转送到硬盘保存
$dumpoff; //停止记录数据变化 $dumpon; //重新开始记录数据变化 $dumplimit(); //规定数据文件的大小(字节) $dumpall; //记录所有指定信号的变化值到数据文件中 begin$dumpfile(“vlog.dump”); $dumpvars(0,top); End
常数表示方法: 《位数》‘《基数》《值》
‘hff01 8’b1101_0001 ‘h83a
Verilog语言是大小写敏感的
HiZ、高阻抗、三态、无驱动源
Verilog 有三种主要的数据类型: Nets Register Parameter
NET种类
类型 功能
wire, tri 对应于标准的互连线(缺省)
supply1, supply2 对应于电源线或接地线
wor, trior 对应于有多个驱动源的线或逻辑连接 wand, triand 对应于有多个驱动源的线与逻辑连接 trireg 对应于有电容存在能暂时存储电平的连接
tri1, tri0 对应于需要上拉或下拉的连接
Register种类
类型 功能 .
reg 无符号整数变量,可以选择不同的位宽。
integer 有符号整数变量,32位宽,算术运算可产生2的
补码。
real 有符号的浮点数,双精度。 time 无符号整数变量,位宽(Verilog-XL仿真
工具用位的正数来记录仿真时刻)
module DUT(Y, A, B_); output Y; input A,B: wire Y, A, B; and (Y, A, B); endmodule
如果信号变量是在过程块 (initial块 或 always块)中被赋值的,必须把它声明为寄存器类型变量 module top; wire y;
reg a, b; DUT u1(y,a,b); initial begin a = 0; b = 0; #10 a =1; „. end endmodule
module md1(out,in1,in2); „..
parameter cycle=20, prop_del=3, setup=cycle/2-prop_del, p1=8, x_word=16’bx,
file = “/user1/jmdong/design/mem_file.dat”;
wire [p1:0] w1; //用参数来说明wire 的位宽 „. initial
begin
$open(file);
„„.
#20000
display(“%s”,file); $stop end „. endmodule
参数值的改写
module mod ( out, ina, inb); „
parameter cycle = 8, real_constant=2.039,
file = “/user1/jmdong/design/mem_file.dat”; „ endmodule
module test; „
mod mk(out,ina,inb);
defparam mk.cycle=6, mk.file=“../my_mem.dat”; „ Endmodule 总结:
看了和没看一样
大致看来,verilog好用,写仿真更容易,但是wire和register更混乱。