if-else RTL模型归纳

本文深入探讨RTL级设计中if-elseif-else结构的建模,分析如何避免产生锁存(latch)及综合过度优化的问题。通过实例讲解了比较器模型的创建,以及使用if结构时避免latch产生的策略,包括添加else分支和赋初值的方法。同时,文章还讨论了在if-elseif电路中避免综合器过度优化的技巧,提出了将if-elseif改为并行if块并结合赋初值的解决方案。

目录
一、基本RTL模型
1.if的模型
2.if-else if的模型
3.else 的模型
二、避免产生锁存-latch
1.latch的产生
2.消除latch
三、避免综合过度优化
1.过度优化的产生
2.避免过度优化的方法

一、基本RTL模型

1.if的模型

always@(*)begin
	if(cmd==2'b10)begin
		done	<= 2'b10
	end
end

在这里插入图片描述
RTL模型为一个比较器

2.if-else if的模型

always@(*)begin
	if(cmd==2'b00)begin
		done	= 2'b00;
	end else if(cmd==2'b01)begin
		done	= 2'b01;
	end if(cmd==2'b10)begin
		done	= 2'b10;
	end if(cmd==2'b11) begin
		done	= 2'b11;
	end
end

在这里插入图片描述
RTL模型为多个比较器,每个比较器的参考电压值为if-else if语句内比较的值

3.else 的模型

always@(*)begin
	if(cmd==2'b00)begin
		done	= 2'b00;
	end else if(cmd==2'b01)begin
		done	= 2'b01;
	end else begin
		done	= 2'b11;
	end
end

在这里插入图片描述
可将电路分为两级,第一级为N个比较器,当进入else的状况时,N路比较器输出全为0,再用这N路0进行组合逻辑产生else内部需要的结果
以上述代码为例,当cmd= =2’b0 | cmd= =2’b1 均不满足时,两路比较器输出均为0,可看作第一级电路;
然后,二号比较器的输出结果取反,接到done[0]=1’b1;
同时,二号比较器的输出结果作为mux的选通信号,地址0输出,输出内容为一号比较器的输出结果取反,即输出1,done[1]=1’b;
于是两路比较器的输出结果经过组合逻辑电路实现
else begin done =2’b11; end

二、避免产生锁存-latch

1.latch的产生

使用条件选择电路,如果不设置冗余项,会产生锁存,即latch

if(cmd==2'b00)begin
		done	= 2'b00;
	end else if(cmd==2'b01)begin
		done	= 2'b01;
	end if(cmd==2'b10)begin
		done	= 2'b10;
	end

在这里插入图片描述
锁存器可以理解为带复位与置位的寄存器,复位输出为0,置位输出为pre端连接值

2.消除latch

(1)if加else,case加default

if(cmd==2'b00)begin
		done	= 2'b00;
	end else if(cmd==2'b01)begin
		done	= 2'b01;
	end else begin
		done	= 2'b11;
	end

在这里插入图片描述
(2)赋初值

	done =2'b0;
	if(cmd==2'b00)begin
		done	= 2'b00;
	end else if(cmd==2'b01)begin
		done	= 2'b01;
	end if(cmd==2'b10)begin
		done	= 2'b10;
	end 

在这里插入图片描述

三、避免综合过度优化

1.过度优化的产生

在if-else if电路中有一种情况,综合时会被过度优化。当if -else if列举出所有的情况,并按照消除latch的思路加上冗余的else项后,会产生以下结果

	if(cmd==2'b00)begin
		done	= 2'b00;
	end else if(cmd==2'b01)begin
		done	= 2'b01;
	end if(cmd==2'b10)begin
		done	= 2'b10;
	end if(cmd==2'b11) begin
		done	= 2'b11;
	end else begin
		done	= 2’b00;
	end

在这里插入图片描述
此时仿真出来的结果已经不正常了,说明电路被过度优化。
产生优化的原因,猜测如下:根据生成else 电路的思路,四路比较器输出均为0,则需要用这4个0产生组合逻辑,得到done = 2’b00;
但是,done = 2’b00是if(cmd==2’b00)的结果,于是中间的三个比较器均被优化掉了。综合电路优化的规则是从第一级输入到输出,我们所需要的中间几个比较器反而被判定为冗余逻辑,而被优化掉了。

2.避免过度优化的方法

将带有优先级的if -else if改为多个并行的if块

	if(cmd==2'b00)begin
		done	<= 2'b00;
	end 
	
	if(cmd==2'b01)begin
		done	<= 2'b01;
	end 
	
	if(cmd==2'b10)begin
		done	<= 2'b10;
	end 
	
	if(cmd==2'b11)begin
		done	<= 2'b11;
	end

在这里插入图片描述
但这样一来,由于无法使用else设置冗余项,又会产生latch.
于是引用消除latch的思路2:赋初值

done <= 2’b00;
if(cmd==2'b00)begin
		done	<= 2'b00;
	end 
	
	if(cmd==2'b01)begin
		done	<= 2'b01;
	end 
	
	if(cmd==2'b10)begin
		done	<= 2'b10;
	end 
	
	if(cmd==2'b11)begin
		done	<= 2'b11;
	end

在这里插入图片描述
成功避免了过度优化与latch的问题。

在 Verilog 2001 中,latch 是一种电平敏感的存储元件,通常在组合逻辑中由于不完整的赋值条件而被综合工具推断生成。设计中若非预期产生 latch,可能会导致时序问题、竞争(race)或功能错误,因此需要特别注意其行为和综合结果。 ### latch 的设计行为 在 Verilog 中,latch 通常由 `always` 块中的不完整 `if` 或 `case` 语句触发。例如,在组合逻辑中,若某个变量在某些条件下未被赋值,则综合工具会推断出 latch 来保持该变量的值。 以下是一个典型的 latch 生成示例: ```verilog always @(*) begin if (en) q = d; end ``` 在上述代码中,当 `en` 为高电平时,`q` 被赋值为 `d`,但在 `en` 为低电平时,`q` 没有被赋值,因此综合工具会推断出一个 latch 来保持 `q` 的值。 ### latch 的综合行为 综合工具在处理 latch 时,通常会根据目标技术库中的 latch 单元进行映射。不同综合工具和库可能会对 latch 的处理方式略有不同,但总体上,它们会保留代码中描述的 latch 行为。例如,Synopsys Design Compiler 会通过 `set_dont_touch` 或 `set_level_sensitive` 等约束来控制 latch 的优化行为。 为了确保 latch 被正确推断,建议在代码中显式地描述其行为,而不是依赖综合工具的自动推断。例如: ```verilog always @(posedge clk or posedge reset) begin if (reset) q <= 1'b0; else if (en) q <= d; end ``` 该代码描述的是一个同步 latch(更准确地说是电平敏感的锁存器),在 `en` 有效时更新数据。 ### 避免意外生成 latch 的代码写法 为了避免意外生成 latch,应在 `always` 块中对所有可能的条件进行完整赋值。例如,使用完整的 `if-else` 结构或 `case` 语句,并确保所有分支中对变量都有赋值。 ```verilog always @(*) begin if (en) q = d; else q = 1'b0; // 明确赋值,避免 latch end ``` 在上述代码中,`q` 在所有条件下都有明确的赋值,因此不会生成 latch。 ### 综合建议 - 在组合逻辑中,确保所有分支都有赋值以避免 latch 的生成。 - 如果确实需要使用 latch,建议显式地在代码中描述其行为,而不是依赖综合工具的推断。 - 使用综合工具的报告功能(如 Synopsys 的 `report_high_fanout` 或 `check_design`)来识别设计中是否存在意外的 latch。 -RTL 仿真中验证 latch 的行为,以确保其符合设计预期。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值