电子说
HDL:hardware Description
这里课件上的 for 不可用于综合,这点不敢苟同
trade-off :但是在这种情况下,电路的传播延迟 -> 数据通路的延迟没改变,但是控制通路的传播也变成了一个选择器和加法器之和,如果 aflag 到来延迟晚,则后一种电路没前者好的性能没这么好:
如以下代码:
always@(a or b or c or d or sel)begin
z=0;
if(sel[3])
z=d;
else if(sel[2])
z=c;
else if(sel[1])
z=b;
else if(sel[0])
z=a;
end
硬件结构为:
如以下代码:
always@(a or b or c or d or sel)begin
z=0;
if(sel[0])z=a;
if(sel[1])z=b;
if(sel[2])z=c;
if(sel[3])z=d;
end
硬件结构为:
最后一级选择信号具有最高的优先级,具有优先级的多选结构会消耗组合逻辑
此处结合阻塞赋值与非阻塞赋值去想都是成立的
如以下代码:
always@(a or b or c or d or sel)begin
case(sel)
2'b00: z=d;
2'b01: z=c;
2'b10: z=b;
2'b11: z=a;
default: z=1'b0;
endcase
end
综合器很难解释 latch,因此,除非特殊用途,一般避免引入 latch.
一般只在异步电路与门控时钟中用到
所以防止产生非目的性 latch 的措施:
对如红绿灯等只有红绿黄三种情况下,采用 2bit 的状态编码则会产生分支赋值不完备的情况:
always@(a or b or c or sel)begin
case(sel)
2'b00: y=a;
2'b01: y=b;
2'b10: y=c;
endcase
end
此时现实的状态已经完备了,但是从数字电路角度出发会有一个 2'b11 下的 latch
此时使用 full-case:
always@(a or b or c or sel)begin
case(sel) // synopsys full_case
2'b00: y=a;
2'b01: y=b;
2'b10: y=c;
endcase
end
此时综合器结果:
则不会推断出 latch
当 case 语句中的分支条件不互斥,则 case 语句存在优先级,如:
always@(irq)begin
int = 3'b0;
casez(irq)
3'b1??: int[2]=1'b1;
3'b?1?: int[1]=1'b1;
3'b??1: int[0]=1'b1;
endcase
end
综合器报告:
使用 parallel-case 原语:告诉 DC,所有条件互斥,并行且无优先级
always@(irq)begin
int = 3'b0;
casez(irq) // synopsys parallel_case
3'b1??: int[2]=1'b1;
3'b?1?: int[1]=1'b1;
3'b??1: int[0]=1'b1;
endcase
end
合理使用 parallel case 约束,可以条件译码逻辑
通过逻辑赋值,降低关键信号的扇出,进而降低该信号的传播延迟,提高电路性能:
trade-off: 资源消耗
若电路中存在较多公共单元,可以通过资源共享来减少面积:
但一般共享会导致性能下降
对到达延迟大的信号,可以重排其电路顺序以降低传播延时,提高性能:
如图,假设 A 来得比较晚,就可以将其尽可能放在后面,隐藏他的延迟
尽可能使用 always 来描述电路,assign 仅仅用来实现连线,如:
assign a = (b==1)?((c&&d)? 1'b1:1'b0):1'b0;
与 always 块描述的:
always@(*) begin
if(b==1'b1)
if(c&&d == 1'b1)
a=1'b1;
else
a=1'b0;
else
a=1'b0;
end
关于 assign 和三目运算符:
全部0条评论
快来发表一下你的评论吧 !