【精品博文】吴明系列博文 FPGA 何去何从(三)
继续一本正经的胡说八道
FPGA的下轮爆发很可能离不开systemverilog,至少前期的点火起步阶段有sv的主要参与。
为什么是sv?,sv有什么特别之处吗?
sv验证方面的东西我就不说了,一是我对验证不熟悉,二来sv已经在验证界证明自己的地位。我想说的是sv 设计,RTL,可综合设计。sv其实也并没有太特别之处(相对于Lisp,Ruby,R这些),准确的说sv不过是verilog的超集。sv大部分(不是全部)设计都可以用verilog来实现。
我是在差不多半年前强制自己全部用sv做设计的,现在回过头来看,sv带来的改变不在于编程语法上,而是在于设计思维上。这个思路的转变其实也只是因为interface功能的引入。举个例子:
视频的常用信号是 vs,hs,de,rgb_data 对于verilog的module port 可能是这么写的
module video_out (
output vs,
output hs,
output de,
output[23:0] rdg_data
);
module video_in (
input vs,
input hs,
input de,
input[23:0] rdg_data
);
systemverilog 可以这么写
此处略去interface定义,interface 可参考IEEE
module video_out (
video_inf.master inf
);
module video_in (
video_inf.slaver inf
);
看似没什么区别,呵呵,往下看,视频转格式是很常见的RGB-> YCbCr , 444->422 这些,sv完全可以把格式转换封装到interface里面,port根本不需要动。如果有一路RGB视频模块输出到一个Ycbcr422的模块,verilog就必须要加入一个转换module。sv就根本不需要动,因为已经把转换事先封装到了interface,
video_out video_out_int(
.vs (vs),
.hs (hs),
.de (de),
.rdg_data (rgb_data)
);
rgb2ycb422 rgb2ycb422_inst(
.vs (vs),
.hs (hs),
.de (de),
.rdg_data (rgb_data) ,
.ovs (y_vs),
.ohs (y_hs),
.ode (y_de),
.ydata (ydata)
);
video_in video_in_int(
.vs (y_vs),
.hs (y_hs),
.de (y_de),
.ydata (ydata)
);
vs 是完全不需要改变的
video_out video_out_inst(
.inf (inf)
);
video_in video_in_inst(
.inf (inf)
);
只需要在video_out模块对RGB信号和video_in模块内直接对YCbCr信号进行引用就行
assign inf.vs = vs;
assign inf.hs = hs;
assign inf.de = de;
assign inf.rgbdata = rgbdata;
assign y_vs = inf.y_vs
assign y_hs = inf.h_hs
assign y_de = inf.y_de
assign ydata= inf.ydata
很想高级语言的面向对象的封装功能,RGB里面其实已经包含了完整的Ycbcr信息,直接把信号封装到一块是十分自然的。这篇只是讲interface的一个偏门的用法,下篇才是讲怎么带来设计思路的变化!