加载中…
个人经历
公司:
  • Mediatek/Nephos

    2013年8月至今

  • Marvell

    2008年7月至2013年8月

  • Spreadtrum

    2006年4月至2008年7月

个人简介
UVM验证专家,验证平台架构师,低成本视频实时压缩方案专家,视频后处理方案专家
个人资料
验证笔记
验证笔记
  • 博客等级:
  • 博客积分:0
  • 博客访问:12,828
  • 关注人气:10
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
访客
加载中…
好友
加载中…
评论
加载中…
留言
加载中…
分类
博文
命令行参数因为可以不用重新编译代码即可重新配置testbench而被广泛使用。在verilog/systemverilog中,提供了$value$plusargs和$test$plusargs两个系统任务来获得命令行参数。UVM则使用uvm_cmdline_processor进一步完善了命令行相关功能。前文提到,在PVM中,不同的命令行参数集合构成了不同的test case,如果全部写在命令行,会造成test case维护困难。为此,PVM提供了pvm_opts这个VIP来专门处理命令行参数。pvm_opts有两类输入源:命令行和一个或多个一定格式的文本文件。每个命令行参数以+开头,独占一行。当同样的参数同时出现在文本和命令行时,命令行有最高优先级即可覆盖在文本文件的取值。pvm_opts提够了一个静态函数pvm_opts::load(string filename)来加载参数文件。需要指出的,load函数可以被多次调用即加载多了参数文件,如果同一个参数出现在多个文件中,则取最后加载的参数值。
pvm_opts提供了一下静态API:
  • function bit get_int(string opt_key, output int value)
例如:
命令行:+min=5
代码:
if (!pvm_opts::get_int('min', min_value)) begin
  `uv
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

作为通用的验证方法学,Accellera只提供了UVM的源代码和用户手册而缺乏参考设计,而各种书籍和教材提供的范例往往侧重于阐明UVM的功能而非实际项目应用,从而导致很多初学者无法高效的搭建UVM的验证平台,甚至有些错误用法被当作经验而传承。在笔者的项目里,笔者喜欢在项目开始之初创建一些基类供项目使用从而达到代码复用的目的,有些基类经过抽象之后也可以被下一个项目调用,从而逐渐形成了笔者自己的一套验证方法学,和UVM不同,这套类库不期望能适合所有项目,故而称之为P(Particular)VM。PVM的目的有三个:
  • 尽可能封装完整功能以最大化代码复用
  • 提供具有工程价值的参考代码
  • 提供验证目录组织及脚本做参考

0 基于PVM的验证平台的执行

有经验的工程师都知道,在公司里一般不会直接敲vcs命令来执行仿真。PVM推荐三级的调用机制。首先,需要为项目创建一个cshrc来定义必要的环境变量。用户通过source这个cshrc来进入验证环境。例如:
setenv PROJ_DIR /home/h
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

插件支持always块的自动插入,如果用户要插入时序always块,需要在端口声明中标志时钟和异步复位信号(仅支持单时钟域)。

例如:

input     mea_clk;  // clock

input     mea_rst_n; // reset

在末行命令模式下输入Alpp,则会在当前光标下一行,插入:

always @(posedge mea_clk or posedge mea_rst_n) begin

    if (mea_rst_n) begin

    end

    else begin

    end

end

同理,Alpn对应(posedge mea_clk or negedge mea_rst_n)

Alnp对应(negedge mea_clk or posedge mea_rst_n)

Alnn对应(negedge mea_clk or negedge mea_rst_n)

Alp对应(posedge mea_clk)

Aln对应(negedge mea_clk)

Al对应always (*) begin

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

支持一下四种类型的变量声明:

1)时序always块中的寄存器变量reg

2)组合always块中的组合reg变量reg

3)assign语句中的网表wire

4)例化模块的输出端口wire

用户在使用变量是需要在至少一个赋值语句的左边或者右边给出该变量的位宽,例如:

A <= 2'b01;

B[3:0] <= 0;

C[5] = 1'b1;

除非在其它语句给出了更高的位宽,否则变量A,B,C的位宽分别为2,4,6。插件支持参数位宽,位宽需要出现在等式左边,例如:

D[WIDTH:0] = 5;

E[2*WIDTH-1] = 1'b1;

变量D和E的位宽分别为WIDTH+1和2*WIDTH。

插件会在/ * autodefine * /之后声明所有变量。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

该功能和Emacs的自动例化非常类似。如果子模块的RTL文件不在当前目录下,需要一个列表文件来提供文件所在路径,列表文件的名字即为当前模块的文件名,扩展名为vc。

例如:

inst0 u0(/ * autoinst * /);
inst1 u1(/ * autoinst * /);

点击Verilog->AutoInst之后,

inst0 u0(/ * autoinst * /
        //Inputs
        .clk        (clk),
        .rst_n      (rst_n),
        .din_valid  (din_valid),
        .din        (din[7:0]),
        //Outputs
        .dout_valid (dout_valid),
        .dout       (dout[7:0]));
i

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

在非ANSI C风格的端口声明之外,还需要声明端口列表。显然这是一项没有意义的工作,由电脑完成更好一些。我们用来代替端口列表。

例如:

module example(/ *autoarg* /);

// comment
input                   in_0;     //comment
input [PAR0-1:0]        in_bus0;  //comment
input [3:0]             in_bus1;  //comment
input                   in_1;     //comment
input [PAR1-1:0]        in_bus2;  //comment
input                   in_0_n;   //comment
input     

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

随着设计复杂度的增加,在书写代码中枯燥的重复性的劳动会越来越多。例如,例化若干个有上百个端口的子模块,这个工作没有任何创造性可言,而且几乎100%会出错误。在verilog中每用到一个新变量都要实现声明,而一个比较复杂的设计,有成百上千个变量都不稀奇。如果没有一个自动化的辅助书写工具,一个设计者花费在简单重复工作的时间甚至会大于花费在创造性工作上的时间!

对于这个问题Emacs提供了一些非常有用的功能,比如自动例化。可惜,Emacs界面并不十分友好,而且其提供的功能也十分有限。

相对于Emacs,Vim更为普遍,至少我更偏爱Vim。我想花些时间写一个自动化的Verilog编辑插件是很有必要的。

下载地址:

http://www.vim.org/scripts/script.php?script_id=2372

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

bmp格式的文件就是文件头+RGB数据,所以从bmp文件很容易转成RGB。jpeg图像是编码之后的YUV数据,需要先jpeg解码才能得到YUV数据,至于YUV和RGB的转换,有固定的公式。网上有一套工具YUVviewer可以很方便的在bmp,RGB和YUV之间转换。大家可以去下载。

阅读  ┆ 转载 ┆ 收藏 
(2008-08-28 09:38)
标签:

it

中值滤波器属于非线性空间滤波器,用于除去图像中的椒盐噪声。中值滤波器只适用于灰度RGB图像(对于YUV图像,应该只需要对Y进行处理),一个有趣现象:对于彩色RGB图像进行中值滤波,得到的输出接近于灰色图像。中值滤波的算法核心就是找出中间值。对于一个3x3的块,只需要找的这样一个值:1)有4个比它小;2)有4个比它大。而不需要进行泡沫排序。对于图像的边界,一般有两种处理方法:边界扩展和不处理。为了跟具有普遍性,此IP不考虑边界问题。

中值滤波器的主要开销在于line buffer,通常line buffer需要存储图像的一行像素。对于3x3块的滤波,就需要两个line buffer,这对于大尺寸图像是一笔很大的开销。我认为,对于这个问题有两种解决办法:1)和其它模块共享buffer,实际限制会比较多,也会影响系统的工作频率;2)把大图像分成小块来处理,这样做IO接口的设计会比较复杂,对于带宽也有一定影响。

本文的IP为Slave模式,输入为8bit,支持断续传输。实际应用中,需要设计一个IO interface。使用了6级流水线,处理速度可以达到1pixel/cycle。

作为一个IP,这个设计可能没有太多价值,毕竟实际情况千差万别。但是,我想,作为一个学习的例子还

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有