笔者是学习FPGA的新手,可以说是刚刚入门级别的,很幸运能够有特权同学的帮助。和特权同学一样,笔者也热爱FPGA的开发,并且渴望成为一位高水平的电子工程师,用特权同学的话说就是我们都是有梦的人。好了,闲话不多说了,在这篇博文中我要谈谈keep属性的使用。由于笔者是新手,要是有什么不对的地方,恳请各位网友批评指正。
我们在设计电路模块的时候,往往有时候都会有一些中间信号,这些信号在综合优化之后就会消失,不像我们定义的那些输入输出端口信号,我们在信号的仿真中是找不到这些信号的。那么如果我们要观察这些信号,就需要另外添加引线将这些信号引出来,而这很可能会改变原来模块内部的布局布线,破坏原来的时序约束等等。这时候,我们可以使用keep属性来将这些信号从模块内部引出,而不用改变原来的布局布线。
下面来看个例子:
以一个一位全加器的代码为例,其顶层代码如下,半加器h_adder和与门or2a代码比较简单就不给出了:
module f_adder(ain,bin,cin,cout,sum);
input ain,cin,bin;
output cout,sum;
wire d,e,f;
h_adder u1(ain,bin,e,d);
h_adder u2(.a(e),.so(sum),.b(cin),.co(f));
or2a u3(.a(d),.b(f),.c(cout));
endmodule
如果我们要看信号e,那么代码综合后,e会不见,我们在仿真中是看不到信号e的。此时我们可以用keep属性了,修改后的代码如下:
module f_adder(ain,bin,cin,cout,sum);
input ain,cin,bin;
output cout,sum;
wire d,f;
(* sysnthesis, keep *) wire e;
h_adder u1(ain,bin,e,d);
h_adder u2(.a(e),.so(sum),.b(cin),.co(f));
or2a u3(.a(d),.b(f),.c(cout));
endmodule
可以看到对信号e添加了(* sysnthesis, keep *),此时我们对它进行仿真的话,就可以看到信号e了。
下面是前后两段代码的RTL Viewer:
可以看到加了keep属性之后会多出来一个三角型的缓冲器,此时查看信号e了。
文章评论(0条评论)
登录后参与讨论