1.进阶的hello verilog
module hello_verilog ();parameter clk_cyc = 10.0;//定义常量reg clk,rstn;
reg [31:0] a;always #(clk_cyc/2.0) clk = ~clk;initial begin$display("Hello Verilog.\n");
endinitial beginclk = 0; rstn = 0;@(posedge clk); //等待时钟上升沿,#和@都是等待的意思a = 1;repeat(5) @(posedge clk);//等待5个时钟上升沿a = 2; rstn = 1;repeat(5) @(negedge clk);$finish();
end
endmodule
2.tri0,定义三态,如果这根线没有驱动,看作加了下拉电阻的线,tri1上拉电阻。通常用于模块间的连接,连接设计和仿真环境,一般可综合代码不用。
initial 不可综合,always可综合。initial用于测试,只执行一次。
3.wire signed [9:0] s0 ;//定义无符号变量,最高位符号位,补码表示。
4.wire [15:0] c0 ;
assign c0 = “ab”; //16’h6162,把a,b的ascii码赋给c0
5.实数型变量目前不可综合
6.wire [3:0] array [0:7];//8个4bit数组成的数组
7.按bit位逻辑操作运算符:&, |, ~, ^ (与,或,非,异或)
e.g. a&b ; a|b ; a^b ; &a ; |a ; ~a ;
8.整体逻辑操作:&&, ||, !, ==(相等), !=(不相等)
9.条件运算符(描述MUX)
assign out = sel ? a : b;
10.bit位 使用[]选择,{}拼接
注:a[0 +: 8] //从0bit 开始取8bit,等价于a[7 : 0]
11.算术运算符: + , -, * , < , > , <= , >= , / , %
wire [13:0] a0,a1,a2;
wire [13:0] b0,b1,b2,div;
wire [15:0] sum;
wire [14:0] sub;
wire [27:0] mul;
wire big,less;assign sum = a0 + a1 + b0;
assign sub = a0 - a1;//sub最大为a0本身,a0最大为2^13-1,最小为负的2^13-1,因此sub定义为15bit,最高位为符号位
assign mul = a2 * b2;
assign div = b1 / a1;
assign big = (a0 > b0) ? 1'b1 : 1'b0;
assign less = (a0 < b0) ? 1'b1 : 1'b0;
仔细定义位宽,确保结果不溢出。通常两个数相加,扩1bit。/ 与%慎用,逻辑资源消耗较大,delay也比较大。
12.4to1MUX
module 4to1MUX (
dout,
din,
sel);
input wire [3:0] din;
input wire [1:0] sel;
output reg dout;always @(*)begincase (sel)2'b00:dout = din[0];2'b01:dout = din[1];2'b10:dout = din[2];default: dout = din[3]; endcase
end
endmodule
13.有符号数符号位扩展
wire [15:0] a,b; //signed number
assign out0 = {a[15],a} - {b[15],b};
assign out1 = a - b;//工具自动扩展0,遇到负数会出错