如何改善多级mux的timing?
时间:10-02
整理:3721RD
点击:
input [5:0] index_32;
mem31 到 mem0 为[63:0]的寄存器
如下代码实现的功能是 通过输入的index_32,经过32级的64选一mux得出需要的index_0.
可是这种方法太慢了,不知道有什么好的结构方法可以实现这样的功能?
assign index_31 = {mem31[index_32],index_32[5:1]};
assign index_30 = {mem30[index_31],index_31[5:1]};
assign index_29 = {mem29[index_30],index_30[5:1]};
assign index_28 = {mem28[index_29],index_29[5:1]};
assign index_27 = {mem27[index_28],index_28[5:1]};
assign index_26 = {mem26[index_27],index_27[5:1]};
assign index_25 = {mem25[index_26],index_26[5:1]};
assign index_24 = {mem24[index_25],index_25[5:1]};
assign index_23 = {mem23[index_24],index_24[5:1]};
assign index_22 = {mem22[index_23],index_23[5:1]};
assign index_21 = {mem21[index_22],index_22[5:1]};
assign index_20 = {mem20[index_21],index_21[5:1]};
assign index_19 = {mem19[index_20],index_20[5:1]};
assign index_18 = {mem18[index_19],index_19[5:1]};
assign index_17 = {mem17[index_18],index_18[5:1]};
assign index_16 = {mem16[index_17],index_17[5:1]};
assign index_15 = {mem15[index_16],index_16[5:1]};
assign index_14 = {mem14[index_15],index_15[5:1]};
assign index_13 = {mem13[index_14],index_14[5:1]};
assign index_12 = {mem12[index_13],index_13[5:1]};
assign index_11 = {mem11[index_12],index_12[5:1]};
assign index_10 = {mem10[index_11],index_11[5:1]};
assign index_9 = {mem9 [index_10],index_10[5:1]};
assign index_8 = {mem8 [index_9 ],index_9 [5:1]};
assign index_7 = {mem7 [index_8 ],index_8 [5:1]};
assign index_6 = {mem6 [index_7 ],index_7 [5:1]};
assign index_5 = {mem5 [index_6 ],index_6 [5:1]};
assign index_4 = {mem4 [index_5 ],index_5 [5:1]};
assign index_3 = {mem3 [index_4 ],index_4 [5:1]};
assign index_2 = {mem2 [index_3 ],index_3 [5:1]};
assign index_1 = {mem1 [index_2 ],index_2 [5:1]};
assign index_0 = {mem0 [index_1 ],index_1 [5:1]};
mem31 到 mem0 为[63:0]的寄存器
如下代码实现的功能是 通过输入的index_32,经过32级的64选一mux得出需要的index_0.
可是这种方法太慢了,不知道有什么好的结构方法可以实现这样的功能?
assign index_31 = {mem31[index_32],index_32[5:1]};
assign index_30 = {mem30[index_31],index_31[5:1]};
assign index_29 = {mem29[index_30],index_30[5:1]};
assign index_28 = {mem28[index_29],index_29[5:1]};
assign index_27 = {mem27[index_28],index_28[5:1]};
assign index_26 = {mem26[index_27],index_27[5:1]};
assign index_25 = {mem25[index_26],index_26[5:1]};
assign index_24 = {mem24[index_25],index_25[5:1]};
assign index_23 = {mem23[index_24],index_24[5:1]};
assign index_22 = {mem22[index_23],index_23[5:1]};
assign index_21 = {mem21[index_22],index_22[5:1]};
assign index_20 = {mem20[index_21],index_21[5:1]};
assign index_19 = {mem19[index_20],index_20[5:1]};
assign index_18 = {mem18[index_19],index_19[5:1]};
assign index_17 = {mem17[index_18],index_18[5:1]};
assign index_16 = {mem16[index_17],index_17[5:1]};
assign index_15 = {mem15[index_16],index_16[5:1]};
assign index_14 = {mem14[index_15],index_15[5:1]};
assign index_13 = {mem13[index_14],index_14[5:1]};
assign index_12 = {mem12[index_13],index_13[5:1]};
assign index_11 = {mem11[index_12],index_12[5:1]};
assign index_10 = {mem10[index_11],index_11[5:1]};
assign index_9 = {mem9 [index_10],index_10[5:1]};
assign index_8 = {mem8 [index_9 ],index_9 [5:1]};
assign index_7 = {mem7 [index_8 ],index_8 [5:1]};
assign index_6 = {mem6 [index_7 ],index_7 [5:1]};
assign index_5 = {mem5 [index_6 ],index_6 [5:1]};
assign index_4 = {mem4 [index_5 ],index_5 [5:1]};
assign index_3 = {mem3 [index_4 ],index_4 [5:1]};
assign index_2 = {mem2 [index_3 ],index_3 [5:1]};
assign index_1 = {mem1 [index_2 ],index_2 [5:1]};
assign index_0 = {mem0 [index_1 ],index_1 [5:1]};
其他的index都是69位,怎么可以作mem的位选择呢?
都是6位,mem[index_?] 是一个bit
后5位不同,因为每个index的最高bit实在变化的!
呵呵,看错了
从逻辑关系来看,这是个算法的问题,不是时序优化的问题。
看来只有在算法上看看有没有其他实现方法,否则很难。
都继续想。
是的,是个逆向回溯的查找,想了很久了,没有好的办法!只能中间加了一级register,但是资源多了许多!
每次位置都二分?
就在中间加了一级,timing基本满足目前的要求,但是不理想,觉得别扭,呵呵!
好论文
have on idea
