每天一点Verilog,《高级FPGA设计》学习笔记:综合编码3

先贴出两段看起来差不多的代码,大家可以想一想,哪个是不好的风格,为什么?

 

代码1:

 

module test(

output reg odat,

input clk,

input idat1,idat2,ictrl1,ictrl2

);

 

always @ (posedge clk)

begin

if(ictrl2) odat <= idat2 ;

if(ictrl1) odat <= idat1 ;

end

 

endmodule

 

代码2:

 

module test(

output reg [3:0] odat,

input clk,

input idat,

input [3:0] ictrl

);

 

always @ (posedge clk)

begin

if (ictrl[0]) odat[0] <= idat ;

if (ictrl[1]) odat[1] <= idat ;

if (ictrl[2]) odat[2] <= idat ;

if (ictrl[3]) odat[3] <= idat ;

end

 

endmodule

 

有人知道答案了吗?不管有没有思路,看下面的结构图就会明白了:

 

代码1的结构图:

 

代码2的结构图:

 

 

 

答案揭晓:代码1的风格是不推荐的,因为它隐含了特权,即排在后面的条件优先级更高。如果在不知情的情况下,修改代码,改变了两条语句的顺序,就可能带来风险。

 

代码2其实在某些情况下也是不推荐的,如果判断的条件不互斥的话,idat就可能同时赋值给多个odat的位。可是如果能够确定判断的条件互不相容,这样的风格实际上会优化时序。

 

看看如果是将互不相容的条件判断写成如下形式会生成什么样的结构图。

 

always @ (posedge clk)

begin

if (ictrl[0])      odat[0] <= idat ;

else if (ictrl[1]) odat[1] <= idat ;

else if (ictrl[2]) odat[2] <= idat ;

else if (ictrl[3]) odat[3] <= idat ;

end

 

 

可以看出代码2的写法在这种时候可以至少减少2个数据选择器的时延。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值