RTL级电路优化

发布时间 2023-12-12 21:21:28作者: 笑着刻印在那一张泛黄

RTL常用逻辑写法

判断两数之差等于1

assign bma_eq_1 = (b[11:0]-a[11:0] == 1'b1) 

与下面的逻辑等效:

assign bma_eq_1 = &(({b[10:0] | ~a[10:0], 1'b0}) ^ (b[11:0] ^ a[11:0]))

加1减1写法

assign a_p1[4:0] = a[4:0]+1'b1

与下面的逻辑等效:

assign a_p1[0] = ~a[0];
assign a_p1[1] = a[1] ^ a[0];
assign a_p1[2] = a[2] ^ (a[1] & a[0]);
assign a_p1[3] = a[3] ^ (a[2] & a[1] & a[0]);
assign a_p1[4] = a[4] ^ (a[3] & a[2] & a[1] & a[0]);
assign a_m1[4:0] = a[4:0]-1'b1

与下面的逻辑等效:

assign a_bar[4:0] = ~a[4:0];
assign a_bar_p1[0] = ~a_bar[0];
assign a_bar_p1[1] = a_bar[1] ^ a_bar[0];
assign a_bar_p1[2] = a_bar[2] ^ (a_bar[1] & a_bar[0]);
assign a_bar_p1[3] = a_bar[3] ^ (a_bar[2] & a_bar[1] & a_bar[0]);
assign a_bar_p1[4] = a_bar[4] ^ (a_bar[3] & a_bar[2] & a_bar[1] & a_bar[0]);

判断两数大小

assign a_ge_b = a[11:0] >= b[11:0]

与下面的逻辑等价:

assign {a_ge_b, a_m_b[11:0]} = a[11:0] + (~b[11:0]) + {11{1'b0}, 1'b1};