请教大牛一个前端设计的问题
..我再弱弱的问一下。。。第一个模块应该怎么写呢。。。。
这个方法貌似高位的有效数字遇到mask为1的值就传播不下去了啊。。。
128x128的阵列
对第k行,考虑mask[127-k],如果是1则复制上级不变,否则
mask[127:127-k] <= {1'b0, mask[127:127-k+1]};
data[127:127-k] <= {1'b0, data[127:127-k+1]};
这样应该可行。。。
最简单的就是,写case,让工具优化
8位宽,256项,不会太复杂的
我的中心思想是要把mask为0的data位吸收掉。
假设mask = 1010,
初始值: d = d3,d2, d1, d0; m = 1010
第一行结束,d = d3, d3, d1, d1; m = 0101
第二行结束,d = 0, d3, d3, d1; m = 0011
mask也需要随着data一起动
data[n] = mask[n] ? data[n] : data[n+1];
mask[n] = mask[n] ? mask[n] : mask[n+1];
嗯嗯 这样就清楚了 也是需要两个128x128的吧。。
楼主有没有在原来移位的思路上,考虑过用CLZ跳过mask中相邻的0和相邻的1?这样最坏
情况下是40个周期,最好是1个周期。假设mask中40个有效位在128位中均匀分布,均值
大概是31.4个周期。如果mask有效位分布集中,期望值会更低。
这种做法的好处是:
1、思路直接,设计简单,面积不大(2个CLZ,几个128位移位器,几个7位加法器)
2、位宽扩展很方便
3、fanout少,routing友好
不好的地方是输出时间不固定需要附加指示信号,最坏情形下latency较长(40 cycle
s)
result[11:0], [7:0] bit save mask data , [11:8] 4 bit save the lenght for valid length
always@(*)begin
case(mask[7:0])
8'b0000_0000: result[11:0]={ 4'd0, (data_in&8b'0000_0000)>>> clz};
8'b0000_0001: resutl[11:0]={ 4'd1, (data_in&8b'0000_0001)>>> clz};
8'b0000_0010: result[11:0]={ 4'd1, (data_in&8b'0000_0010)>>> clz};
endcase
我给你一个建议,实现这个大表,最好想个办法,用C++ print 一个规规距据的表达式,然后Print出来
或者如果你们部门用Perl Vperl 用表达式自动生成代码
手写的东西,不安全,其实w我的{ }代码是可以自动生成的,我就是简单写两个