【正文】
parameter [7:0] BASE = 8’b10000000。 wire [7:0] OFFSET1,OFFSET2。 wire [15:0] ADDR1,ADDR2,COUNT1,COUNT2。 assign OFFSET1 = BASE PTR1。 // Could be f(BASE,PTR) assign OFFSET2 = BASE PTR2。 // Could be f(BASE,PTR) assign ADDR1 = ADDRESS {8’h00 , OFFSET1}。 assign ADDR2 = ADDRESS {8’h00 , OFFSET2}。 assign COUNT1 = ADDR1 + B。 assign COUNT2 = ADDR2 + B。 assign COUNT = (CONTROL == 1’b1) ? COUNT1 : COUNT2。 endmodule 高性能編碼技術(shù) 在下面的例子中, if語句的條件表達(dá)中包含有操作符。 module cond_oper(A, B, C, D, Z)。 parameter N = 8。 input [N1:0] A, B, C, D。 //A is late arriving output [N1:0] Z。 reg [N1:0] Z。 always @(A or B or C or D) begin if (A + B 24) Z = C。 else Z = D。 end endmodule 高性能編碼技術(shù) 若條件表達(dá)式中的信號 A是晚到達(dá)信號。因此要移動信號 A使其離輸出近一些。 高性能編碼技術(shù) module cond_oper_improved (A, B, C, D, Z)。 parameter N = 8。 input [N1:0] A, B, C, D。 // A is late arriving output [N1:0] Z。 reg [N1:0] Z。 always @(A or B or C or D) begin if (A 24 B) Z = C。 else Z = D。 end endmodule 其它要注意的問題 ? 不要引入不必要的 latch ? 敏感表要完整 ? 非結(jié)構(gòu)化的 for循環(huán) ? 資源共享 不要產(chǎn)生不需要的 latch ? 條件分支不完全的條件語句( if和 case語句)將會產(chǎn)生鎖存器 always @(cond_1) begin if (cond_1) data_out = data_in。 end always @(sel or a or b or c or d) begin case (sel) 2’b00: a = b。 2’b01: a = c。 2’b10: a = d。 end 敏感表要完整 不完整的的敏感表將引起綜合后網(wǎng)表的仿真結(jié)果與以前的不一致。 always @(d or clr) if (clr) q = 1’b0 else if (e) q = d。 always @(d or clr or e) if (clr) q = 1’b0 else if (e) q = d。 非結(jié)構(gòu)化的 for循環(huán) 綜合工具處理循環(huán)的方法是將循環(huán)內(nèi)的結(jié)構(gòu)重復(fù)。在循環(huán)中包含不變化的表達(dá)式會使綜合工具花很多時間優(yōu)化這些冗余邏輯。 for( I =0。 i4。 i=i+1) begin sig1 = sig2。 unchanging statement data_out(I) = data_in(I)。 end sig1 = sig2。 unchanging statement for( I =0。 i4。 i=i+1) data_out(I) = data_in(I)。 資源共享 只有在同一個條件語句 (if和 case)不同的分支中的算術(shù)操作才會共享。 條件操作符 ?: 中的算術(shù)操作不共享。 if (cond) z = a + b。 else z = c + d。 Z = (cond) ? (a + b) : (c + d)。 括號的作用 利用括號分割邏輯。 z = a + b + c + d。 Z = (a + b) + (c + d)。 + a b + c + z d + a b + c d + z