代码规范有利于在项目和工程中的维护,养成习惯对后期的工作学习会有很大的帮助!
下面就看下各个情况的规范书写格式是什么
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<DELAY_TIME)begin
math=sec_low;
end
else if(delay<DELAY_TIME*2)begin
math=sec_high;
end
else if(delay<DELAY_TIME*3)begin
math=min_low;
end
else begin
math=min_high;
end
end
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<DELAY_TIME)begin
math=sec_low;
end
else if(delay<DELAY_TIME*2)begin
math=sec_high;
end
else if(delay<DELAY_TIME*3)begin
math=min_low;
end
else begin
math=min_high;
end
end
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