帮忙看这句语句怎么优化(verilog)
时间:10-02
整理:3721RD
点击:
always @ (posedge clk or negedge rstn)
begin
if(!rstn)
CbCr_out<= 8'b0;
else
CbCr_out <= CbCr_pre[10]? 8'h00 : (CbCr_pre[9]| CbCr_pre[8]) ? 8'hff : CbCr_pre[7:0]; ////就是这个语句
end
编译后发现程序中 CbCr_out 严重影响了fmax导致达不到要求,
想把这个语句优化下以减少内部延时,请知道怎么改写比较好啊?
begin
if(!rstn)
CbCr_out<= 8'b0;
else
CbCr_out <= CbCr_pre[10]? 8'h00 : (CbCr_pre[9]| CbCr_pre[8]) ? 8'hff : CbCr_pre[7:0]; ////就是这个语句
end
编译后发现程序中 CbCr_out 严重影响了fmax导致达不到要求,
想把这个语句优化下以减少内部延时,请知道怎么改写比较好啊?
如果这条路径确实是critical path的话,在中间插个dff吧.
把(CbCr_pre[9]| CbCr_pre[8]) ? 8'hff : CbCr_pre[7:0]用一个reg变量寄存一下.
不过要注意满足时序.
尝试这样写
always @ (posedge clk or negedge rstn)
begin
if(!rstn)//异步清零
CbCr_out<= 8'b0;
else if( CbCr_pre[10] )//同步清零
CbCr_out<= 8'b0;
else if( CbCr_pre[9]| CbCr_pre[8] )//同步置位
CbCr_out<= 8'hff;
else
CbCr_out <= CbCr_pre[7:0];
end
如果你的综合库中包含了带同步清零和置位的触发器,那么综合出来的结果要比你的写法性能要好,如果没有的话,那就要考虑其他方法了
也乡了解一下 谢谢
我觉得这段代码应该可以达到时钟要求的吧
请教问下karnizhu,你的写法相比有什么好处
CbCr_out <= {8{CbCr_pre[10]}} && ({8{CbCr_pre[9] | CbCr_pre[8]}} ||CbCr_pre[7:0]);
我认为
个人意见!
你用香农公式展开或用面积转化成速度的方法!