FPGA-Verilog的书写规范格式

代码规范有利于在项目和工程中的维护,养成习惯对后期的工作学习会有很大的帮助!

下面就看下各个情况的规范书写格式是什么

1.时序逻辑的规范写法:

    always  @(posedge clk or negedge rst_n)begin    
        if(rst_n==1'b0)begin
            tmp_init<=1'b0;
        end
        else begin
            tmp_init<=time_ram_init;
        end
    end

2.组合逻辑的规范写法:

    always  @(*)begin
        if(delay

3.always的规范写法:(一个always只穷举一个变量的各种情况)

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            tmp_a1<=0;
        end
        else if(vld_in)begin
            tmp_a1<=a;
        end
        else begin
            tmp_a1<=tmp_a1;
        end
    end
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            tmp_b1<=0;
        end
        else if(vld_in)begin
            tmp_b1<=b;
        end
        else begin
            tmp_b1<=tmp_b1;
        end
    end

4.阻塞赋值与非阻塞赋值

//时序逻辑用非阻塞
    always  @(posedge clk or negedge rst_n)begin    
        if(rst_n==1'b0)begin
            tmp_init<=1'b0;
        end
        else begin
            tmp_init<=time_ram_init;
        end
    end

//组合逻辑阻塞
    always  @(*)begin
        if(delay

5.对齐实例:begin 对齐 信号对齐

/*对齐示例*/
//信号对齐:
    input                   clk                      ;
    input                   rst_n                    ;
    input                   time_ram_init            ;
    input                   time_ram_wr              ;
    input  [ONEDATA_W -1:0] time_ram_data            ;
    input  [ADRESS_W  -1:0] time_rd_times            ;
    input                   time_en                  ;
    output                  time_ram_ovful           ;
    output                  time_vld_out             ;
    output [NUM_W-1     :0] time_num_out             ;
    
    reg                     time_ram_ovful           ;
    reg                     time_vld_out             ;
    reg    [NUM_W     -1:0] time_num_out             ;
    reg    [ADRESS_W  -1:0] wr_adr                   ;
    reg    [ADRESS_W  -1:0] rd_adr                   ;
    reg                     tmp_init1                ;
    reg                     tmp_init2                ;
    reg                     flag_init_wadr           ;
    reg                     tmp_wr1                  ;
    reg                     tmp_wr2                  ;
    reg                     wr_en                    ;
    reg    [CNT_W     -1:0] count                    ;
    reg    [CNTOF_W   -1:0] cnt_ovful                ;
    reg    [CNTVLD_W  -1:0] cnt_vld                  ;
    reg    [ONEDATA_W -1:0] data_ram [DATARAM_W-1:0] ;
    reg    [CNTVLD_W  -1:0] vld_cnt_tmp              ;

//begin end对齐:
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else begin
           tmp_init1<=time_ram_init;
        end
    end

6.信号的书写规范

/*参数、宏定义字母必须用大写*/
//参数的定义:
    parameter     ADRESS_W  =   11;
    parameter     ONEDATA_W =   32;
    parameter     NUM_W     =    8;
    parameter     CNTOF_W   =    4;
    parameter     CNTVLD_W  =    4;
    parameter     CNT_W     =   20;
    parameter     DATARAM_W = 2048;
//宏定义
`define OC8051_ALU_NOP 4'b0000
`define OC8051_ALU_ADD 4'b0001
`define OC8051_ALU_SUB 4'b0010
`define OC8051_ALU_MUL 4'b0011
`define OC8051_ALU_DIV 4'b0100
`define OC8051_ALU_DA  4'b0101
`define OC8051_ALU_NOT 4'b0110

7.时钟复位信号使用示例

//时钟只能用在敏感列表,一个模块只能用一个时钟
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else begin
           tmp_init1<=time_ram_init;
        end
    end
//禁止信号做时钟,而要用改成时钟使能的方式;
//正确的做法:
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           counter<=1'b0;
        end
        else if(counter==7)begin
            counter<=0;
        end
        else begin
           counter<=counter+1;
        end
    end
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            en<=0;
        end
        else if(counter==7)begin
            en<=1;
        end
        else begin
           en<=0;
        end
    end
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else if(en==1)begin
           tmp_init1<=time_ram_init;
        end
        else begin
            tmp_init1<=tmp_init1;
        end
    end

8.reg和wire的使用

/*reg类型的使用*/
    reg                     tmp_init1                ;
    reg                     tmp_init2                ;

    /*时序逻辑*/
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
           tmp_init1<=1'b0;
        end
        else begin
           tmp_init1<=time_ram_init;
        end
    end

    /*组合逻辑*/
    always  @(*)begin
           tmp_init2 = tmp_init1;
    end

/*wire类型的使用*/
    wire sys_rst_n;
    wire clk_25m;

    system_ctrl	u_system_ctrl(
	.clk				(clk_50m),//input	
	
	.sys_rst_n			(sys_rst_n),//output
	.clk_c0				(clk_25m)   //output
);


9.输入输出的规范

/*不能用组合输出*/
//正确的做法
module key(clk,rst_n,key,key_out);
    input               clk    ;
    input               rst_n  ;
    input               key    ;
    output              key_out;
    reg                 key_out;


    ******
    ******


    always @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            key_out<=1'b0;
        end
        else if(count==COUNT_TIME-1)begin
            key_out<=1'b1;
        end
        else begin
            key_out<=1'b0;
        end
    end
endmodule
//错误的做法
module key(clk,rst_n,key,key_out);
    input               clk    ;
    input               rst_n  ;
    input               key    ;
    output              key_out;
    reg                 key_out;


    ******
    ******


    always  @(*)begin
       key_out=sw_5&(~sw_4);
    end 
endmodule

 

你可能感兴趣的:(#,Verilog知识专题)