多路选择器如何设计更好(case与3目选择操作)
时间:10-02
整理:3721RD
点击:
主要是讨论case和a?b:c操作根本综合后,在面积和timing上有何不同,哪种方式更好?
以8路选择器为例
case可设计为
a?b:c方式可设计为
初看两者综合出来的应该是同样的电路,不知道有没有人试过?
有经验的可以来讨论讨论有没有区别?
有区别的话哪种设计更优?
或者有没有其他更好的设计方法,尤其是当数据位宽更大,sel路数更多时?
以8路选择器为例
case可设计为
- always @(*) begin
- case(1'b1)
- sel0 : data_out = data_in0;
- sel1 : data_out = data_in1;
- sel2 : data_out = data_in2;
- sel3 : data_out = data_in3;
- sel4 : data_out = data_in4;
- sel5 : data_out = data_in5;
- sel6 : data_out = data_in6;
- sel7 : data_out = data_in7;
- default: data_out = 0;
- endcase
- end
a?b:c方式可设计为
- assign data_out = sel0 ? data_in0 :
- sel1 ? data_in1 :
- sel2 ? data_in2 :
- sel3 ? data_in3 :
- sel4 ? data_in4 :
- sel5 ? data_in5 :
- sel6 ? data_in6 :
- sel7 ? data_in7 : 1'b0;
初看两者综合出来的应该是同样的电路,不知道有没有人试过?
有经验的可以来讨论讨论有没有区别?
有区别的话哪种设计更优?
或者有没有其他更好的设计方法,尤其是当数据位宽更大,sel路数更多时?
case 更好一些吧;sel需要一级一级判断,就产生优先级了吧。
这两个综合出来一样的,可读性case更好一些。
这两个一样,都是带优先级的,不带优先级可以人肉这么写:
assign x = ({WIDTH{a_en}} & a) | ({WIDTH{b_en}} & b)...
这两个其实都有优先级,都是一样的,综合出来电路应该也是一样的。
这个就是资源用得太多了,数据位宽大的时候就不划算了。数据位宽小的时候这个还比较适用。
但是如果在case 之後加上 //parallel_case 這個 directive
case 這個寫法 timing 會變快,但是沒有priority
这个建议好,可以试试,目的也是想速度更快
很不错的很好的
作为初学者的我都是用case的,第二种方法也很好
