微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于多位的数据选择器

关于多位的数据选择器

时间:10-02 整理:3721RD 点击:

小弟我最近分别用连续赋值和过程块写了2个很简单的数据选择器,选择端是2bit的,综合出来的RTL Viewer不一样,但我看时序分析完全一样。这2种写法综合出来的电路是不是一样的呀?只是RTL Viewer看到的不一样?

  1. module temp_2(
  2. input [1:0]sel,
  3. input a, b, c,
  4. output out
  5. );
  6. assign out = (sel == 2'b00) ? a :
  7.      (sel == 2'b01) ? b :
  8.      (sel == 2'b10) ? c : 0;
  9. endmodule

复制代码


RTL Viewer图如下



另一种是用过程块写的:

  1. module temp(
  2. input [1:0]sel,
  3. input a, b, c,
  4. output reg out
  5. );
  6. always @(*) begin
  7.   case (sel)
  8.    2'b00 : out <= a;
  9.    2'b01 : out <= b;
  10.    2'b10 : out <= c;
  11.    default : out <= 0;
  12.   endcase
  13. end
  14. endmodule

复制代码


RTL Viewer图如下:
[attach]377857[/attach]

把第二个方法中的非阻塞赋值改为阻塞赋值应该就一样了
这个电路时组合电路,没必要用非阻塞

这个问题很经典。
正是经常用的一个考题,verilog里面用if else写出来的代码和case写出来的同样逻辑功能的代码,综合出来有什么不一样。

第一种写法相当于if else的方式,具有优先级,所以和case写出来的不同,RTL图正好对应。

仔细看一下RTL视图,第一个RTL视图里面是有优先级的,第二个RTL视图里面没有是并行的,没有优化级的概念。
正好和if-else,case语句对应



    谢谢你的回复!
我把非阻塞改成阻塞之后综合出来的效果还是一样的呀。并没有什么改变。
另外,如果我对组合电路用非阻塞的话会出现什么问题吗?我觉得对于组合电路阻塞和非阻塞应该是一样的。不知我的想法对不?



    谢谢你的回复!
if-else-确实是由很多级二选一的数据选择器起来的,但我查过case的语法,夏宇闻的那本书上说执行完case分项后的语句之后,跳出该case语句结构,终止case语句的执行。相当于也是变形的if-else语句,也就是说,我把case语句块里面的任意2行交换的话,优先级就不同了。
另外,我对比过2种写法的综合效果,综合出来的pin-to-pin的延迟完全一样,毫无差别。所以我猜想是不是2种写法生成的硬件结构是一样的呢?



    谢谢你的回复哈!
那这个问题的答案是啥?不一样?不过虽然表面上电路结构不一样,但我综合出来的pin-to-pin延迟却完全一摸一样,具体情况还请看我9楼的回复。不知我说的对不对?



    谢谢你的回复!
这位高手也请你看我9楼的回复,不知我说的对不对?

1. if-else条件写全后和full-case应该是等价的,现在的综合器都会自动选择,是使用有优先级的(延迟大资源少)还是使用无优先级的(延迟小资源大)。
2.在RTL VIEW里面,是看不到最终FPGA的映射结果,只是纯粹的HDL到RTL图的映射。实际如果用ASIC实现,既有可能综合成前一个,也有可能综合成后一个。
3.在FPGA内,无论前一个还是后一个,都是用LUT表实现的,所以pin2pin的延迟一样。

the difference between 'if else' and ' case'

你这个是应用于FPGA的。就这个流程来说,我的分析如下(不一定完全正确,仅供参考)
1. 这两种写法都是完全合法的,实际上综合结果很明显会不一样的,这个是肯定的。if else的结构延迟会大一些的,毕竟是优先级编码。
2. 最后你看到的pin-to-pin延迟一样。很可能是因为FPGA综合后的优化动作,现在综合的工具也不是傻子,很智能的,它会根据你写的时序约束要求,优化你写的代码。将map之后的网表(你可以参考technical view,虽然不完全准确)优化到你时序约束的样子。所以,你看到的延迟是优化之后的。也许综合器(如quartus)帮你做了综合优化。
最后,需要强调的是,为了尽量减少综合器优化的代价,还是利用case来降低系统延迟,提高设计性能。这个是比较好的设计习惯。
综合器优化的代价有:
1. 综合和后端时间比较长,特别是时序约束比较紧(速度快)。
2. 综合器优化有些就事论事,或者说,比较笨,它只会根据自己的规则来做。而不会具体的设计具体分析。



    谢谢你的回复哈!现在大概明白了!



    谢谢你的回复哈!现在大概明白了!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top