|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 charlie_zhang 于 2017-4-3 21:04 编辑
最近做项目,真真碰到了一个所谓的ECO问题,什么叫ECO,百度百科是这么说的“Engineering Change Order”,即工程师手动去改变设计,这句话是针对目前设计比较依赖EDA工具这个大背景的,即在不复杂的逻辑中,小范围的改动网表(netlist),或者版图(pr),而不用对RTL代码重新做综合,时序约束(sta),时钟树综合(CTS),等等一系列流程。
只需要稍微改动RTL代码,手动改写PR后的器件(例如更换器件和连线),只需要对RTL和最后的版图文件做formality形式验证,只要match即可,不用再按照IC设计综合流程,时序分析,时钟树综合等后段流程再走一遍,大大节约了时间,缩短了流片准备时间。
这里涉及三个问题:
1. 怎样的情况适合ECO?
2. RTL代码怎样的code style适合ECO?
3. 综合工具如何将RTL映射到电路,重点是如何优化电路?
[size=13.3333px]首先,第1个问题
[size=13.3333px]一般都是逻辑不是很复杂的改动,较小的改动,举例如下
- nrst1 = A & B & C;
- nrst2 = A & B;
- aways @(posedge clk or negedge nrst1) begin
- reg00 <= 1'b0;
- reg01 <= 1'b0;
- reg02 <= 1'b0;
- end
- else begin
- case(state)
- `idle: ...
- `cut: ...
- `freeze: ...
- endcase
- end
- end
复制代码
上述RTL代码中,case组合电路决定对三个寄存器reg00,reg01,rego2进行寄存器数据输入控制,而nrst1的低电平对三个寄存器进行复位;如果现在想更改reg00的复位条件,例如想用nrst2来复位reg00,而nrst1仍然用于复位reg01和reg02。
那从后端设计来说,需要和前端设计工程师一道,来确定更改点,找到reg00映射的那个寄存器。插入合适的门电路,例如插入一个二输入端与门电路,两个输入是A和B。
其次,第2个问题
上述代码如何改动呢?一个aways块里控制很多寄存器,共用一个组合控制电路,即对state对译码电路,而若要改动上述代码,使之余后端版图formality match,逻辑上等价。则很难更改,原因是我尝试了很多,但都以失败告终,有的是没有用RTL表达正确的意图,有的是不了解综合工具的局限性。
最后只能分开来控制每个寄存器,每个寄存器用一个always块来控制,每个always块里只有一个单独的复位信号,这样就能从前端修改RTL代码与后端版图formality match;并且综合也不会报错误。
最后,第3个问题
涉及到一个重要到问题:三个always块中,每个都有对state的译码电路,他们本来是可以公用一个译码电路的,那么综合工具能否正确认识并优化之呢?[size=13.3333px]实际中,按照第2个问题中的解决办法,formality确实通过了,综合也没有报错。
[size=13.3333px]formality虽然通过了,formality match是指从很多输入点(包括寄存器输出,pad输入);输出点(只有一个,寄存器输入或者pad输出),进行逻辑扫描,遍历一遍后,逻辑match。
[size=13.3333px]很明显综合工具综合优化不会仅仅以fomality的逻辑锥为基本单位,也会涉及到不同的逻辑锥共享相同的组合电路,以达到降低面积的目的,在添加约束时,一般以时序满足为第一目标,然后在此基础上优化面积,理论上上述不同的写法,综合工具也会对其优化得到相同的电路结构,相同的逻辑功能的。 |
|