如:
if (a == b) begin
v1 = 2'b01;
v2 = 2'b10; //v3 is not assigned end
else if (a == c)
begin
v2 = 2'b10; v3 = 2'b11; end
else begin
v1 = 2'b00;
//default赋值 //v1 is not assigned
v2 = 2'b00; v3 = 2'b00; end
(2)CASE语句
(a)所有的case语句都应该有一个default语句,避免产生Latch (b)(建议)不要使用casex、casez语句,综合工具不支持 ? 循环语句
(1)forever语句 (2)repeat语句 (3)while语句 (4)for语句
在可以用其它语句描述电路时,建议不要采用循环语句来描述。 ? initial语句
不要在RTL代码中出现initial 块
综合会将initial块忽略,使前仿真和后仿真不一致 initial begin ...... end
第 13 页 共 28 页
? always语句
(1)在使用always生成组合逻辑时,敏感表要列全,敏感表中也不能包含没有用到的变量。 Rule:
Combinational sensitivity lists should include 1)Any signal on right hand side of assignment 2)Any signal in if or case expression For example: ......
module sense_list_ex( b, c, d ); //PARAMETER
//INPUTS
input b; input c; input d;
//OUTPUTS
//INOUTS
//SIGNAL DECLARATIONS wire b; wire c; wire d; reg a;
//ASSIGN STATEMENTS
第 14 页 共 28 页
//MAIN CODE always @ (b or c or d) if (b==1’b1) a = c & d; else
if (c==1’b1) a = d;
endmodule //SENSE_LIST_EX
(2)对带异步清零端的寄存器的定义模板 always @(posedge clk_main or negedge rst_n)
if (rst_n == 1'b0) //此处统一采用rst_n == 1'b0形式而不采用(! rst_n) begin //形式,对相关寄存器清0(采用 # `u_dly<= 赋值) ...... end else begin
//对相关寄存器赋值(采用 # `u_dly<= 赋值) ...... end
采用时钟上升沿触发。
? 有限状态机(FSM)
(1)组合逻辑和时序逻辑分开描述;
// PART 1: COMBINATERIAL LOGIC FOR NEXT STATE always @(cur_state or full_new_fr or full or have_space) begin: OVC_FSM_NXT_ST case (cur_state) STDBY: begin
if (full_new_fr == 1'b1)
nxt_state = W_BLOCK; else if (full == 1'b1)
nxt_state = W_DSCD; else
nxt_state = cur_state; end
W_BLOCK:
第 15 页 共 28 页
begin
if (have_space == 1'b1) nxt_state = STDBY; else
nxt_state = cur_state; end W_DSCD: begin
if (have_space == 1'b1) nxt_state = STDBY; else
nxt_state = W_BLOCK; end default:
nxt_state = STDBY; endcase
end // OVC_FSM_NXT_ST
// PART 2: SEQUENTIAL LOGIC FOR CURRENT STATE
always @(posedge clk or `RST_EDGE reset)
begin: OVC_FSM_ST_TRANS if(reset == `RST_VALUE)
cur_state <= `DLY W_BLOCK; else
cur_state <= `DLY nxt_state; end // OVC_FSM_ST_TRANS
3 电路设计规则
3.1 时钟
? (建议)简单的时钟结构易于理解、分析和维护,而且容易产生好的综合结果。
最好是能够有单一的全局时钟,所有寄存器都在上升沿触发。 ? 所有子模块内部使用单一时钟单一时钟沿,如条件不满足时,必须注明原因,并
提出对综合以及布线的要求。 ? 设计中包含内部产生的时钟时,必须将所有需要的时钟在一个单独的模块中生成。 ? 如果不得不用混合的时钟沿,在综合和时序分析时确保能满足时钟精度最差情况
下的占空比。同时确保把假定的占空比写入用户手册。
在多数设计中,占空比是时钟树的函数,而时钟树的插入通常又依赖于具体的工艺。使用Core的芯片设计者必须检查实际的占空比能够满足Core的要求,也
第 16 页 共 28 页
相关推荐: