【Verilog】语法的基本概念

本文为 Verilog 学习总结,讲解 Verilog 语法的基本概念。

Verilog 模块的基本概念

首先来看一个二选一 MUX 程序,支持了逻辑行为的描述:

module muxtow(out, a, b, sl);
input a,b,sl;
output out;
reg out;
    always@(sl or a or b) // 只要sl或a或b一个变化,就执行下面的语句
        if(!sl) out = a;
        else out =b;
endmodule

带有与非门的二选一 MUX 程序(逻辑表达式):

module muxtwo(out, a, b, sl);
input a,b,sl;
output out;
wire nsl,sela,selb; // 定义内部连接线
	assign nsl=~sl;
	assign sela=a&nsl; // 按位与运算
	assign selb=b&sl;
	assign out=sela|selb;
endmodule

另一种写法(支持基于逻辑单元互联结构的描述):

module muxtwo(out, a, b, sl);
input a,b,sl;
output out;
	not ul(nsl,sl);
    and #1 u2(sela,a,nsl); // #1表示延时一个单位时间
	and #1 u3(selb,b,sl);
	or #1 u4(out,sela,selb);
endmodule

如果程序符合一些基本规则,计算机可以将程序从第一种写法通过第二种写法的中间形式自动转换为第三种写法的模块,称为综合。

通过连续赋值语句描述 3 位加法器的程序:

module adder(count,sum,a,b,cin);
	input[2:0]a,b;
	input cin;
	output count;
    assign {count,sum}=a+b+cin; // 计算和及向上进位
endmodule

采用两个模块的三态门选择器程序:

module trist1(sout,sin,ena); // 上层模块
output sout;
input sin,ena;
	// 引用由mytri模块定义的实例元件tri_inst
    // .表示被引用模块的端口,()表示本模块中与之连线的线路
    mytri tri_inst(.out(sout),.in(sin),.enable(ena));
endmodule

module mytri(out,in,enable); // 子模块
output out;
input in,enable;
	assign out=enable?in:'bz;
endmodule

除了 endmodule 语句外,每个语句和数据定义的最后必须有分号。

Verilog 用于模块的测试

verilog 可以用来描述变化的测试信号,测试平台可以对电路模块进行动态的全面测试,从而对系统进行验证。

对本文前 3 个二选一 MUX 测试程序为:

include"muxtwo.v"
	module t;
	reg ain,bin,select;
	reg clock;
	wire outw;
	initial // 把寄存器变量初始化为确定量
	begin
		ain=0;
		bin=0;
		select=0;
		clock=0;
    end
    alway #50 clock=~clock; // 产生周期为100个单位的时钟信号
    always @(posedge clock)
    begin
        // 产生随机的位信号流ain和bin
        #1 ain={$random}%2; // {$ random}为系统任务,产生一个随机数
        #3 bin={$random}%2;
    end
    always #10000 select=!select; // 产生周期为10000时间单位的选通信号变化
    
        muxtwo m(.out(outw),.a(ain),.b(bin),.sl(select));
    endmodule

测试在功能级上进行,称为前(RTL)仿真,如果门级结构与具体工艺技术对应起来,称为后仿真。可运行仿真器观察输入/输出波形图来验证正确性。

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/107702709