【CUMT计算机系统设计】Verilog语法概览

发布时间 2023-12-25 16:10:28作者: Wennz-y

基操

  • 标识符区分大小写,逻辑值不区分

  • 首字符必须为字母/下划线

1. 模块

Module

有I/O功能的黑盒

2.逻辑块

always

  • 构建 组合 and 时序 逻辑块:if, case, for...

  • always @(...)
    begin
    ……
    end

  • 上升沿posedge

  • 下降沿negedge

generate

  • 主要结合for:

  • 对向量多个位重复操作

  • 对同一模块多次重复实例化

initial

  • 初始化

  • 不可综合,不出现在RTL代码中

  • 除了仿真,没太多用途

3.赋值方式

assign

  • 连续

  • 两信号间真实的物理连接

  • 不可在always块中使用

=

  • 阻塞赋值

  • always中使用

  • 顺序执行

<=

  • 非阻塞赋值

  • always中使用

  • 并行执行

基础语法

1.逻辑值与逻辑运算

逻辑值

  • 0

  • 1

  • x:未知状态

  • z:高阻状态

(x/z不区分大小写

逻辑运算

  • 逻辑运算符:&&、== 、|、!=

  • 按位运算符:&、|、、~、^、

  • 归约运算符:&、|、、~、^、

2.常量

  • 十进制整数

  • 基数法

    • 32 ' b(可每四位一下划线,增添可读性

    • 32 ' o

    • 32 '

    • 32 ' h

    • 32位,二/八/十/十六进制

  • 字符串:“ ”

3.注释

  • //:行注释

  • /* */:块注释

  • 同CPP

4.变量

wire

线网型:

  • 电路间的物理连接

  • 其定义的变量可看作信号端口

  • 两wire被assign(连续赋值)时,在逻辑块中会被映射成真实的物理连线

  • assign b = a ;

reg

寄存器型:

  • 抽象的数据存储单元

  • 对某一时间点状态进行保持

  • always、initial中左值均为reg

  • 仅assign中左值为wire

5.向量

//格式:
input/output  wire/reg [upper:lower] vector_name

//输入输出型
input [7:0] a,b,
output reg [7:0] out

// 模块中间向量
wire [7:0] c, e;
reg [7:0] d;

6.分支语句

if-else:

  • if

  • else if

  • else

case:

  • case

  • ... :

  • default :

  • endcase

模块中的参数传递

定义可传递参数的模块:

module counter
// 参数传递
#(
    parameter COUNT_MAX = 25'd24_999_999,
    parameter STATE     = 1'b0            // 多个参数用逗号隔开
)
(
    input  wire  sys_clk,
    output reg led_out
);
// 代码主体
endmodule

带参数模块的实例化:

// 参数传递
#(
   .COUNT_NUM( 25'd24_999_999),        // 传入参数
   .STATE(1'b0)
)
counter1_init      // 实例化模块的名称位置
(
    .sys_clk   (sys_clk),
    .led_out(led_out)
);