测试平台(testbench)是在硬件验证中最基础也是最重要的部分。测试平台的质量将严重影响到整个硬件验证的质量。如何编写一个高效的测试平台是一个重大的课题。


测试平台

测试平台,英文原文是testbench,由test和bench两个英文词组成。bench英文原意为长凳,在这里只是形象地说明了testbench的结构。如图2-1所示,测试平台包围在被测元件(DUT,Device Under Testing,也有人写做DUV[1]。在公司里使用DUT习惯了,还是用这个词吧)周围,形状就像一个长凳。

在测试平台中,最重要的四个部分是数据生成单元(Data Generator)、数据传输单元(Data Transactor)、数据对比单元(Data Comparator)和参考模型(Reference Model)。如图2-2所示。

在测试过程中,由测试方案(testcase)控制数据生成单元生成输入数据,然后通过数据传输单元将激励送至DUT(也可以叫做设计模型)和参考模型。参考模型预测出相应的结果,连同DUT响应一并送入数据对比单元。数据对比单元对比预测结果和实际结果,如果结果一致则表明DUT响应正确;如果不一致则表示至少有一方面结果是错误的,此时测试平台会发出错误警报。

注意:在数据不一致的情况下,并不一定是DUT响应错误,也有可能是参考模型预测错误,这时需要根据功能设计(Functional Specification)来判断。同样的,如果DUT响应和参考模型预测一致,也不能保证他们是正确的,有可能设计工程师和验证工程师犯了同样的错误,从而导致结果一致。

由于设计模型和参考模型由不同人员开发的,所以出现相同错误(对于同样的输入给出同样的错误结果)的可能性很小,这样也保证了测试平台的正确性和高效。如果出现同样的错误,大部分也会在覆盖验证中被发现,这个以后再讲。

数据生成单元(Data Generator)

顾名思义,数据生成单元就是生成数据用的。一般来说,数据生成单元中会包含一些约束条件(constraints),用来生成符合规定的数据。

这里插一段,对于硬件验证,容错性并不重要。硬件的本质是对数据的处理,而不是对错误的检测和恢复。对于一个完善的硬件来说,最重要的是数据通路(datapath),因为数据通路直接关系到数据处理的正确性;但是对于错误的处理,很简单,遇到错误的数据记录下来并给一个中断(interrupt)就行了。也可以这么理解,如果容错做得多了,芯片必然会变得很庞大,成本也会增加。所以,在做硬件验证时,绝大多数时间都是在验证符合规定的激励,错误情况已经包含在对中断的验证中了。

再回到数据生成单元。虽然说只有数据生成单元也能生成我们想要的数据,但是当我们需要做针对性验证(Deterministic Verification)的时候,我们要把我们不太关心的一些情况给去掉。这个时候就需要在测试方案中加入更多的约束条件。前面提到过,Vera是面向对象的编程语言,这里要用到的就是“继承”。我们可以在测试方案中建立一个数据生成单元的子类,继承原数据生成单元的所有属性、方法和约束条件,同时加入自己的约束条件和对数据的处理。这样一来,新的数据生成单元就可以生成我们需要的数据了。

数据传输单元(Data Transactor)

数据传输单元用来将数据生成单元生成的数据传送到DUT和参考模型中(见图2-3)。一般我们提到的BFM(Bus Function Module,总线功能模块)就属于数据传输单元。有些时候,数据传输单元并不直接将数据送入参考模型,而是通过参考模型中的监视单元(monitor)进行数据采样。具体结构见图2-4。

参考模型(Reference Model)

前面已经说过,参考模型根据从数据传输单元传入的输入激励来预测相应的DUT响应,然后将预测结果传入数据对比单元。参考模型是测试平台中最重要的部分。自动验证需要完善的参考模型,所以参考模型的制作也是一项很浩大的工程,可以认为是把设计模型用HVL重写一遍。

参考模型中比较特殊的是寄存器驱动(Register Decoder)。这个在后面将详细说明。

数据对比单元(Data Comparator)

数据对比单元接收到来自DUT的相应和来自参考模型的预测(predict)之后,将两者相比较。如果一致,则说明DUT通过相应验证,但并不保证DUT相应正确;如果不一致,则报告错误。

这里将会出现一个时序的问题。首先要明确的是DUT是按照时钟周期(clockcycle)工作的,每一个时钟周期做一个工作;但是参考模型没有时钟的概念。或许对软件工程比较了解的人会说程序是按照时间片(time slice)来运行的,但是要明确,模拟器(simulator,或者称作仿真器)也是按照时间片来生成时钟周期的。所以,当参考模型完成预测之后,我们并不知道DUT响应是否已经到达。

这个时候,聪明的数据对比单元会将刚刚送入的DUT响应或者参考模型预测保存在相应的队列(queue)中,然后进行无序对比(compare without order)。保存DUT响应的是实际结果队列(actual queue),保存参考模型预测的是期望结果队列(expected queue)。DUT响应进入数据对比单元时会在期望结果队列中查找对应的值(matching),参考模型预测进入数据对比单元时会在实际结果队列中查找对应的值。如果找到对应的值,则将对应值从队列中删除(remove);如果找不到,则将自己保存到相应的队列中。

在验证结束的时候,测试平台会检查实际结果队列和期望结果队列。如果都为空,则说明全部的实际和预测数据都相吻合,验证没有问题。如果其中有一个队列不为空,则说明验证出现不相吻合的情况,这时候要根据相应的情况来进行调试(debug)。

 

这一部分先讲到这里,下一部分将会讲到测试方案(testcase)。


[1] 参见《编写测试平台(第二版)》

SCENE 场,场景
由单一镜头或数个镜头组成的戏剧单位。

SCIENCE-FICTION FILM 科幻片
电影类型的一种,其特色的情节包含了科学奇想。乔治里叶的《月球之旅》是电影史上最早的一部科幻片。

SCREWBALL COMEDY 神经喜剧
始于1930年代的一种美国剧情片,特点是嘲讽、性坦白、罗曼史、滑稽突梯之情境,以来自不同社会阶层可爱的人物为号召,并涉及动作激烈的事件。

SCREWBALL COMEDY 脱线喜剧
在1930年中期出现的一处美国喜剧电影,描述的往往是荒唐绝伦、体编统尽失的家庭冲突或爱情冲突。

script 电影剧本
泛指以文字描述整部影片的人物和动作内容,所采取的各种写作形式。

SETTING 场景
整部或部分电影的拍摄场地。

SHADOW PLAY 皮影戏
在一张半透明的布幕或纸幕背后,操作平面的皮革道具,利用灯光在幕上形成的剪影进行表演的一种艺术表演。最早起源于中国,是电影发明前的活动光影响到影像。

SHOOTING script 分镜剧本
亦称为“导演剧本”,包含动作、对白,以及导演和摄影师的重要工作资料之剧本。

SHOT 镜头 摄影机单一一次的开机,也指开机所拍摄下来的那段影片。

SLATE 场记板
上面以粉笔写着场次、镜次、导演、片名、影片公司等资料的小木板,上缘还附有一段拍扳,上涂黑白相间条纹,一端可以开合,可以拍出清楚响声,以便剪接时声画同步作业的进行。

SOAP OPERA 肥皂剧
滥情的广播连续剧或电视连续剧。

SOUND BOOM 麦克风杆
一支供悬挂麦克风用的杆子,可延伸至场景上空随人或物之移动而移动。

SOUND EFFECTS 音效

为增进一场面之真实感、气氛或戏剧讯息,而加于声带上的杂音或声音。

SOUND TRACK 声带
位于有声影片边缘的光学声轨或磁性声轨,可承载对白、旁白、音乐和音效。

SPECIAL EFFECTS 特殊效果
不是以直接的电影拍摄技巧获取的镜头。包括需要使用轮廓遮幕、多重影像蒙太奇、分割银幕、画面渐量、模型等技巧的镜头。也应用于爆破、弹道效果和机械效果。

SPECTACLE 大场面电影
具备华丽之美术而设计、史诗主题和雄伟场面等特色之电影。如:《宾汉》(1962)、《星际大战》(1977)、《窈窕淑女》(1964)、《大地震》(1975)。 SPLICE 接合
接合两段影片的动作——使用的方法包括:粘合、接合、贴胶带,或以钉子或扣眼处理,亦指影片交叠或接合的部分。

SQUIB 枪击效果
电影制作中的一种引爆装置,用来模拟中弹的状况。
STAND IN 定位替身在安排布景、设定摄影机位置、测光、调整灯光等繁琐过程中,暂时代替明星站在表演位置上的人。

STAR SYSTEM 明星制度
透过强调领衔主演的演员而非影片的其他成分的宣传,来吸引观众的制度。

STILL 定格
电影镜头运用的技巧手法之一。其表为银幕上映出的活动影像骤然停止成为静止画面(呆照)。

STILLS 剧照
为了促销而自一电影场面中拍下来的,或从影片画面上取下的照片。

STRAIGHT MAN 搭档谐星
在银幕上,以搭档方式演喜剧的谐星。

STRUCTURAL FILM,PERCEPTUAL FILM 结构电影,知觉电影
使用或慢或快的摄影机运动、重复配音、极长的伸缩镜头、闪烁的影像或拍摄银幕上放映的影像的电影,目的在探讨电影媒体的结构。

STUDIO FILM 片厂电影
在摄影棚内搭景拍摄而非实景拍摄的影片。

STUNTMAN 特技演员
被雇用来替代电影演员表演需要特别体能、体力的技术动作或危险动作的人。

SUBJECTIVE TIME 主观时间
影片角色所经验或感觉的时间,经由摄影机运动和剪接来表现。

SUBTITLES 翻译字幕
即印于影片下沿的对白翻译。

SUN GUN 太阳灯
一种可携带的手持轻电池灯具。

SURREALIST FILM 超现实主义电影
现代电影的一种运动,1920年兴起法国,主要是将意象做特异、不合逻辑的安排,以表现潜意识的种种状态。

SUSPENSE FILM 悬疑片
情节使人对主要人物的命运引起关切,而造成高度焦虑和紧张感的一种电影类型。

SCORE 配乐
根据电影的色彩、情绪、气氛、人物、情节发展而创作,紧密地为表现影片主题和剧情服务的乐曲。

SCREEN 银幕
一种由反射性或半透明的材料制成,其表面可供投射影像的电影放映设备。

SCREEN TEST 试镜
用拍摄一段影片的方式,来决定某人是否适合当演员,或某演员是否适合于演出一部影片中的某个角色。它与另一个字AUDITION相互通用。

SECOND UNIT 第二工作组
一个编制完整的制作人员组合,通常负责拍摄不需要导演或主要演员在场的影片部分。

SEMIOLOGY 电影符号学
随着法国结构主义思想运动的勃兴,于1960年代中叶诞生的应用符号学理论,为研究电影艺术的一门符号学新分支。它运用结构语言学的研究方法,分析电影作品的结构形式,基本上是一种方法论。
SENSURROUND 临场音响
为制造特殊效果而设计的一种电影音响系统,多半用于增加动作片之气势,例如《大地震》(1975)。

SEQUEL 续集影片
情节发展延续前一部影片故事的电影。续集通常因为前一部影片的票房好,想将它所造成的魅力再加利用而拍摄的。例如《教父》(1972)、《大白鲨》(1975)都拍过续集。

SERIAL 续集电影
1912年至1920年间风行之电影风格,每一集人物、地点连贯,大都为好人与恶人相斗,总在最后一刻结局揭晓前喊停,观众必须继续看下回才知结局。

SERES FILM 影集用相同的人物,演出型态风格相近的故事之电影,每一集的长度通常都与剧情长片相当。如今,影集已变成电视节目的一种标准型态。

SEXPLOITATION 性剥削电影
专以色情来满足大众口味的影片。

SHOOTING RATIO 拍摄比例
拍摄时所用底片长度,与实际放映的影片长度之比例,例如拍摄时用了五万尺底片,而放映时才用了一万尺,就是5:1的拍摄比例。

SHORTS 短片
放映长度较短的影片,一般指全长不超过三十分钟。

SLAPSTICK COMEDY 闹剧
取法粗鲁、带攻击性动作之喜剧,以不造成伤害的暴力行为为其重点。英文的典故来自一副由两块木头组成的拍板。最早出现闹剧的是卢米埃的《水浇园丁》(1895)。 SLEEPER 连珠电影
首映时没没无闻,但后来被影评家“发掘”出来的好电影。

SLOW MOTION 慢动作
影像之进行,较其自然运动为慢的一种特殊效果。是以加速摄影的技术达成的。

SOFT FOCUS 柔焦
利用特别的滤色镜片,或将纱网或其它的散光器材置于镜头前,以拍摄出略微失焦的效果。经常被用来创造浪漫的气氛。

SOURCE MUSIC 现场音乐
自场面某处发出之音乐,如收音机、留声机或乐团之演奏,是背景音乐的一种。

SPLIT-SCREEN PROCESS 分割画面
以线条将画面分成数个独立视像区域的暗房技巧。在《天罗地网》(1968)和《辣手人魔》(1968)这两部片子里面,分割画面用的特多。

SPOTLIGNT 聚光灯
照度强、照幅窄、便于朝场景中的特定区位集中照射的灯,是摄影棚内用得最多的一种灯。

STAR 电影明星
在银幕上取得一定艺术成就或有票房号召力的电影演员。

STEADICAM 摄影机稳定器
一种轻便的电影摄影机机座,可以手提。它在1970年代逐渐为人普遍使用。在《洛基》(1976)的练拳场面中,摄影机稳定器充分发挥了它的妙用。 STOCK FOOTAGE 资料片
制作一部影片用到其它影片的画面时,该段画面就叫资料片。《广岛之恋》(1959)就用了很多广岛原爆的纪录片做资料片。

STORY BOARD 画面分镜剧本
以草图、绘画或照片,依连戏顺序将影片段落或整部影片的主要动作和叙述流程摘述出来。广泛地被用在动画片的制作,以及呈给客户审阅的电视广告影片企划中。

STORY EDITOR 编审
电影公司编剧部门的职员,职责在审阅故事大纲,并对读稿员所提供的戏剧或其它文字材料加以评估。

STUDIO
1.制片厂 制作影片的复杂生产机构。如好莱坞的大制片厂。
2.摄影棚制片厂的主要生产建筑。可以其中搭置布景,安排各种灯光设备,以进行影片拍摄工作。

SUBJECTIVE SHOT 主观镜头
表示片中角色观点的镜头。当角色扫视一场面,或在一场面中走动时,摄影机代表角色的双眼,显示角色所看到的景象。

SUBPLOT 次要情节
一电影故事之次要发展。它往往触及主要情节或丰富主要情节。

SUPER-8 超8毫米电影
1965年上市的8毫米影片,多用于拍摄业余电影和教育影片。

SYNC 音画同步为SYNCHRONIZATION与SYNCHRONISM的缩写,指电影画面和声音保持一致的对应状态。

SYNOPSIS 故事梗概
为电影所写的简要故事纲要,亦称“本事”。

TAKE 镜次
在摄取一个镜头或一个场景时,摄影机的一趟启动停止,称为一人镜次。有时候一个镜头的完成需要拍很多镜次。

TECHNICOLOR 特艺彩色
一种彩色电影的摄制系统,由柯达公司出品。在1950年代之前,几乎是彩色影片的代名词。

TEXT 本文
电影批评用语。指可以在电影空间、时间中存在的任何表意系统。详细地研读影片本文是电影符号学的重要范畴。

THEME SONG 主题曲
代表影片主题的歌曲,或因风行而被认为对一影片具有代表性的电影插曲。如《银河》(MOON RIVER)则是《第凡内早餐》(1961)的主题曲。

THIRD CINEMA 第三电影
泛指第三世界电影工作者所制作的反帝、反殖民、反种族歧视、反剥削压迫等主题的电影。

THREE-DIMENSIONAL FILM 立体电影
以特殊的拍摄方式使影片放映时能够对观众产生立体效果的一种电影,简称“3D”电影。

TIE-IN 电影附加产品与一部电影相关连的各种商品,最常见的情况是同时出版改编的小说或原声带专辑唱片。例如《蝙蝠侠》(1989)的附加产品多达一百多种。

TODD-AO 陶德宽银幕
由陶德公司研究发展的一种宽银幕系统,它用的底片规格是65毫米,而且只需要一部摄影机和一部放映机。《奥克拉荷马之恋》(1955)和《环游世界八十天》(1956)是最先采用陶德宽银幕系统的影片。

TRACKS 移动车轨道
铺设在地面供移动车滑行地轨道。

TRANSITION 转场
自一场景转至另一场景,或自一段落转至另一段落时,所采用的种种方法。

20TH CENTURY-FOX 二十世纪福斯电影公司
1935年透过合并而成立的一家美国电影公司。由戴立欧柴纳克担任重负责人达四十年,现被并购于梅多克的新闻集团之下,是好莱坞主流的制片厂之一,代表作为《铁达尼号》(1987)(〈泰坦尼号〉)。

TYPECASTING 类型选角
依演员的长相、气质、特征等性质,来决定适合他演出的角色。一个演员一旦在银幕上演活了某种角色,他就会把这种角色一直演下去。

TAIL 尾片白片
一卷影片末端所接的一段不透明胶片,以确保影片完整的放映到最后一格,也对影片有保护作用。

TALENT SCOUT 星探
指专事发掘那些具电影表演才能,而且有可能成为明星的伯乐。

TEASER 片头,
开场戏指放在电影片头字幕前的一场戏,旨在引导观众对以后故事的兴趣。

THRILLER 惊悚片
以侦探、神秘事件、罪行、错综复杂的心理变态、或精神分裂状态为题材的一种电影类型。

TIMING 动作时机
在一场戏里头,导演或演员为达成某种节奏或其它效果,而对戏剧动作的表演时机特意去加以掌控之意。

TITLES 字幕
附加在影片上的种种文字,如影片的片名、演职员表、唱词、译文、对白、说明词以有人物介绍、地名和年代等。

TRAILER 预告片
将精华片段,经过刻意安排剪辑,以便制造出令人难忘的印象,而达到吸引人的效果的电影短片。

TRAVELOGUE 观光影片
以各种有趣的风土民情为题材的一种纪录片。

TREATMENT 故事剧本
电影剧本的一种摘要,在内容上包括了完整的故事情节发展,全部的主要场景,以有一些具有关键性的对白。

UNITED ARTISTS 联美公司
1919年由四位著名导演及演卓别林、范朋克、毕克馥、格里菲斯出资创建,逐步发展成为控制美国电影生产和发行的八大公司之一。在1981年并入米高梅公司,改称为米高梅——联美娱乐公司,以出品007系列电影知名。

UNDERGROUND CINEMA 地下电影
做为独立制片影片、前卫电影和实验电影的同义词。也指处理尖锐题材,或故意反传统的电影。

UNIVERSAL 环球电影公司
由卡尔蓝默尔于1912年成立的一家美国电影公司。

UPSTAGE 后表演区
剧场用语,指一个场景的后边地带,即距离摄影机较远的地带。

VENICE FILM FESTIVAL 威尼斯影展
世界上的第一个国际影展,开始于1932年,所设奖项为 金狮奖。

VIEWFINDER 观景窗
摄影机本身固有的或附加在镜头外的一种取景装置。

VISTAVISION 维士宽银幕
美国派拉蒙公司出品的一种宽银幕系统。

VOICE OVER 旁白
说话者不出现在画面上,但直接以语言来介绍影片内容、交待剧情或发表议论,包括对白的使用。

WALK ON 龙套演员
电影中的小角色,作用是如背景般陪衬主角,而且多半没有对白,在演职员字幕中也不一定能够列名。

WALK-THROUGH 试戏
即排演,进行时不按摄影机快门。

WAR FILM 战争片
以描写战争或以战争为主要故事背景的电影类型。

WARNER BROTHERS 华纳电影公司
于1919年,由华纳四兄弟成立的一家美国电影制作公
司。拍摄了美国影史上第一部有声剧情片《爵士歌手》(1927)

WEEPIE 感伤剧
美式俚语,原意为“掉眼泪”,后来转借来指那种专门制造感伤情节的爱情文艺片。

WESTERN 西部片
美国特有的一种电影类型,大多以十九世纪后半斯的美国为背景。第一部西部片是1903年爱德温波特根据1900年匪徒打动火车事件而拍摄的《火车大劫案》。

WHODUNIT 擒凶片
神秘恐怖片或侦探片的俗称。

WIDE SCREEN 宽银幕电影
比传统标准银幕更宽的一种银幕规格。把放映画面予以展宽,使观众扩大视野,增加临场真实感。

WIPE 划接
转场的一种手法。所谓划,指的是一个镜头自银幕的一端向另一端移动,而划去前一个镜头之意。

WRITER 编剧
编剧在整个电影的制作过程中所扮演的角色,主要是为一部电影提供故事剧本或电影剧本。亦称“SCREEN WRITER”。

X-RATED MOVIE X级影片;成人电影;春宫片
美国电影分级中的一个级别,为“十八岁以下青年不准进入”之代称。

ZOETROPE(WHEEL OF LIFE) 生命回转盘
一种十九世纪的动画机器,是威廉霍纳发明的。视觉暂留的原理在电影发明之前用以说明。美国导演柯波拉以此作为其制片公司的名字。

ZOOM SHOT 伸缩镜头
指不改变摄影机及被摄对象,仅改变镜头焦距即可获得从全景渐变至近景(或反之)的电影画面。

想了半个月,决定还是写一些关于硬件验证的文章,也算是我前4个月实习工作的总结。内容比较多,我慢慢写,也就当连载了。
本文大部分由我的工作报告翻译整理而来,有些地方翻译得可能不尽完美,我已将关键的英文原词给出。


在硬件验证方面,我也是个初学者,但是看过了国内某论坛对于硬件验证的讨论,觉得现在国内实在对硬件验证理解得太单纯。

什么是硬件验证?

硬件验证(或者说“芯片验证”),真正的英文是Pre-silicon Verification,就是流片前验证。硬件验证实际上是对设计模型(RTL)的功能性验证,同时尽量发现潜在的隐患。也就是说,硬件验证的首要任务是保证设计模型能完成所有预先设计的功能,其次才是发现设计漏洞(bug)。所以,硬件验证并不是单纯的调试(debug)。

为什么要硬件验证?

硬件和软件不一样。如果软件出现漏洞(bug),进行相应的升级(update)或者修补(patch)就可以了。但是硬件就不同了。如果硬件出现故障(malfunction),唯一的解决方法就是替换(replacement),这将耗费大量的人力和财力。同时,芯片厂同批产品全部需要销毁,这对于芯片制造企业来讲,也是一个很大的损失。所以,现在的芯片制造企业大多都成立了专门的硬件验证部门,其目的就是防患于未然。

硬件验证是硬件生产中非常关键的一步,以至于现在的硬件厂商用二倍于设计的时间来进行验证。[1] 通过验证,不仅可以找出缺失的功能和错误的响应,也可以测试硬件的性能和发现隐藏的问题。在硬件验证过后,虽然不能保证硬件100%稳定运行,但是可以确认在绝大多数情况下硬件能正常工作。

怎样进行硬件验证?

最早的硬件验证使用确定性验证法(Deterministic Verification,我觉得翻译成“针对性验证法”更恰当些),也就是手工生成激励输入(stimulus),然后人工比对输出响应(response),如果响应与设计相吻合,则内部电路正确。这种方法的好处就是针对性非常强,我们可以针对某一个信号或者某一个引脚的动作(behaviour)进行测试。但是这种方法的弊端也很明显,如果对每一个引脚都做确定性验证,那将消耗大量的时间和精力。尤其是现在的芯片规模越来越大,功能越来越复杂,如果做完整的确定性验证,花费的时间可能达到数百年。

现在比较通用的方法是随机验证法(Randomization),就是由程序随机生成输入激励,然后将输出响应和预测值进行比对,从而判断设计是否工作正常。这里就需要引入一个“参考模型(Reference Model)”的概念。

由于输入是随机的,不确定的,那么如何得出相对应的输出就是一个很棘手的问题。如果用人工计算的方法,那就和前面提到的确定性验证法一样了。为了避免大量的人力劳动,预测的过程将由程序来替代。而这个通过输入预测输出的模型就叫做参考模型。在实际操作中,参考模型和设计模型由不同的人员编写,以保证对设计理解的一致性。换句话说,就是避免同一个人犯同样的错误。

事实上,现在的硬件验证已经将针对性和随意性两种验证方法相结合,发挥两者的优势,达到验证开销的最小化。整体随机验证法是硬件验证的终极方案,即所有的输入激励均由程序随机产生。这种方法的好处就是保证了输入的多样性,同时能检测出只有在特定状态下才会引发的错误(Corner Cases)。但是这种方法对于参考模型的要求非常高,一般到验证后期、待参考模型完善才会使用。

既然自动验证需要程序预测,那么相应的编程语言也就由此而生。通常,在设计上,工程师们使用硬件设计语言(HDL,Hardware Design Language或者Hardware Description Language),但是,在验证方面,硬件设计语言无法胜任大部分要求(比如说,遇错报警,随机产生激励等等)。这时候,硬件验证语言(HVL,Hardware Verification Language)出现了。目前用得比较广泛的硬件验证语言是Synopsys的Vera和Cadence的

e

语言。有人说SystemVerilog和SystemC是更高级的硬件验证语言,没错,但是我只接触过Vera,对Vera最熟悉,所以下面对硬件验证的讨论我将使用Vera语言。

Vera语言

Synopsys公司很有意思,他们说OpenVera是一个语言而Vera是一个编译器。这种混淆视听的言论没必要再追究了,既然绝大多数工程师都说Vera语言,那么我也顺着一起称Vera为语言。在此我不想介绍Vera的历史,但是要提一点,听说Vera是一个中国团队开发的,开发这个语言的人都很厉害,在硬件方面都是大师级水平。暂且不论这个道听途说是否正确,首先这些大师能研究出能被工业界广泛应用的高级工具就让人佩服。

Vera语言是一个面向对象(OO,Object Oriented)的语言,其核心概念就是对象和继承,这一点相信学过Java的人都很熟悉。Vera程序能够很好地和Verilog程序交互,这也是使Vera成功的重要一点。Vera的语法跟Java、C和Verilog都很相似,这样一来可以缩短学习Vera语言的时间。最后要提一点,Verilog+Vera+OVA的功能升级后就是SystemVerilog。所以,要掌握SystemVerilog的概念,Vera必不可少。

 

这一部分就先讲这么多,下一部分开始讲测试平台(testbench)。


[1] 参见《编写测试平台(第二版)》

终于能有一部让我放弃“DV影片”这个词的片子了。
我不称《寄生人》为DV影片,并不是因为这部片子拍得好,
而是因为这部片里面名角比较多。
黄秋生、张家辉、范冰冰,表演的都很出色。

但是,故事基线就不敢恭维了。
说是悬疑片,但是直到1个小时之后才出现悬疑,
之前的内容也就只是唠家常。

几位演员的造型都很不错,人物性格把握得很好。
但是配音就差得多了。怎么听怎么觉得黄秋生是个半男不女的。
对话也很生硬,尤其是两位香港演员的台词,不知所云。

综合来看,导演不错、化妆不错,但是剧本方面很是欠缺。

最近更多关心的是国内的“二线影片”,就是那些非“大牌导演”的影片。
今天又看了一个,《追爱总动员》。

因为看过了《武林外传》,里面很多演员都很熟悉了。
但是出乎意料的剧情却给了我一个惊喜。
地铁上的邂逅、生活中的擦肩而过、背后的炒作与朋友的支持,
影片从头到尾都处于一个写实的状态,
没有过多的铺垫,没有累赘的搞笑,也没有复杂的对话。

从故事方面,《追爱总动员》和《爱情呼叫转移》如出一辙,
都是用一条故事主线,同时融入一些2006年的大事。
但是相比《爱情呼叫转移》而言,《追爱总动员》更注重故事性。

另外,《追爱总动员》的镜头运用与特效制作也很值得称道。
整部片把升降臂的优点运用得淋漓尽致,特效方面则可以用“淡雅”来形容。
背景音乐音效也运用得很好,没有那种台湾综艺的二百五效果。

看过一遍之后,对于整部片的评价大体上是,
不算盛大的场面,不算大牌的演员,不算著名的导演,不算深刻的故事,拼出了一部非常不错的电影。

值得观看!

今天,看了一下国产新片《天台》。
先粗略看了一下演员列表,没什么大牌演员。
现在比较喜欢独创性电影,看看再说。

整个电影的叙事手法比较单调,时间线采用的是顺序讲述。
镜头运用也一般般,有几处拍纸片下落的时候,纸片太靠近屏幕边缘。
配音可以算是影片的一个亮点,和影片基调很相称。
至于故事发展,就是一大败笔了,叙事太拖拉。

看过之后,我把《天台》也归结为DV电影一类。
虽然影片投入了不少,有升降机,投入了大批的人力。
但是,无论怎么说,影片还是没走出编剧策划的误区。
整个影片,从头至尾唯一的亮点,就是女孩上天台的动机。
而这一高潮却出现在1小时15分钟。
可以说,如果按照我的口味,看到10分钟的时候就会把片子给删了。

整个影片废镜头不少,但是镜头的角度都找得很好。
如果把叙事的时间线打乱,效果会更好。

既然是当DV电影看的,我没有去注意演员的亮点。
整个影片,除了没有台词的女主角,有台词的角色也就记者演得还不错。
而女主角,也就只是在房檐走来走去。
整体看来,就像是一部DV电影,只是资金投入的多了,有些拍摄手法的花样而已。

第一步:修改 include/discuzcode.func.php

查找

[php]$message = preg_replace("/\s*\[code\](.+?)\[\/code\]\s*/ies", "codedisp('\\1')", $message);[/php]

在下方添加

[php]$message = preg_replace("/\s*\[emule\](.+?)\[\/emule\]\s*/ies", "emu('\\1')", $message);[/php]

查找

[php] return $htmlon || $allowhtml ? $message : nl2br(str_replace(array("\t", ' ', ' '), array('        ', '   ', '  '), $message));[/php]

替换成

[php] $message = $htmlon || $allowhtml ? $message : nl2br(str_replace(array("\t", ' ', ' '), array('        ', '   ', '  '), $message));
return str_replace("/<br />","/\n",$message);[/php]

查找

[php]"/\[url=(https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k){1}:\/\/([^\[\"']+?)\](.+?)\[\/url\]/is",[/php]

替换成

[php]"/\[url=(https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp){1}:\/\/([^\[\"']+?)\](.+?)\[\/url\]/is",[/php]

在文件尾部的“?>”前添加

[php]
function emu($code) {
global $discuzcodes;
$discuzcodes['pcodecount']++;
$codecount=$discuzcodes['pcodecount'];
$code = htmlspecialchars(str_replace('\\"', '"', preg_replace("/^[\n\r]*(.+?)[\n\r]*$/is", "\\1", $code)));
$view = '';$temp = $total = 0;
$searcharray = explode("\n",$code);
$view = "<br><br><table width=80% align=center cellspacing=1 cellpadding=5 class=tableborder><tr><td colspan=2 align=center class=header>下面是eMule专用的下载链接,您必须<a href='http://www.emule.org.cn/download/' target='_blank'>安装eMule</a>才能点击下载</td></tr>";
foreach($searcharray as $emule) {
if($emule!='' && eregi("^ed2k:\/\/",$emule)){
$temp++;
$emule = dhtmlspecialchars(trim($emule));
$emule_array = explode("|",$emule);
$total += $emule_array[3];
$totalper = esizecount($emule_array[3]);
$view.="<tr class=category><td class=smalltxt width=88%><input type=\"checkbox\" name=\"em$codecount\" value=\"$emule\" onclick=\"em_size('em$codecount');\" checked=\"checked\"><a href=\"$emule\"><script language=\"javascript\">document.write(unescape(decodeURIComponent(\"$emule_array[2]\")));</script></a></td><td class=smalltxt align=center>$totalper</td></tr>";
}
}
$total=esizecount($total);
if($temp>0){
$view.="<tr><td align=left><input type=\"checkbox\" id=\"checkall_em$codecount\" onclick=\"echeckAll('em$codecount',this.checked)\" checked=\"checked\"/> <label for=\"checkall_em$codecount\">全选</label> <input type=\"button\" value=\"下载选中的文件\" onclick=\"download('em$codecount',0,1)\"> <input type=\"button\" value=\"复制选中的链接\" onclick=\"copy('em$codecount')\"><div id=\"ed2kcopy_em$codecount\" style=\"position:absolute;height:0px;width:0px;overflow:hidden;\"></div></td><td class=smalltxt align=center id=\"size_em$codecount\">$total</div></table><br>";
}
$discuzcodes['codehtml'][$discuzcodes['pcodecount']] = "<div class=\"eMuleMain\">$view</div></div>";
$discuzcodes['codecount']++;
return "[\tDISCUZ_CODE_$discuzcodes[pcodecount]\t]";
}

function esizecount($filesize) {
if($filesize >= 1073741824) {
$filesize = round($filesize / 1073741824 * 100) / 100 . ' G';
} elseif($filesize >= 1048576) {
$filesize = round($filesize / 1048576 * 100) / 100 . ' M';
} elseif($filesize >= 1024) {
$filesize = round($filesize / 1024 * 100) / 100 . ' K';
} else {
$filesize = $filesize . ' bytes';
}
return $filesize;
}
[/php]

第二步:修改include/javascript/common.js

在结尾添加

[php]
function checkAll(str,checked) {
var a = document.getElementsByName(str);
var n = a.length;

for (var i = 0; i < n; i++) {
a[i].checked = checked;
}
em_size(str);
}

function download(str, i, first) {
var a = document.getElementsByName(str);
var n = a.length;

for (var i = i; i < n; i++) {
if(a[i].checked) {
window.location=a[i].value;
if (first)
timeout = 6000;
else
timeout = 500;
i++;
window.setTimeout("download('"+str+"', "+i+", 0)", timeout);
break;
}
}

}

function copy(str) {

var a = document.getElementsByName(str);
var n = a.length;
var ed2kcopy = "";
for (var i = 0; i < n; i++) {
if(a[i].checked) {
ed2kcopy += a[i].value;
ed2kcopy += "";
}
}
copyToClipboard(ed2kcopy);

}

function copyToClipboard(txt) {
if(window.clipboardData) {
window.clipboardData.clearData();
window.clipboardData.setData("Text", txt);
} else if(navigator.userAgent.indexOf("Opera") != -1) {
window.location = txt;
} else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip)
return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans)
return;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip)
return false;
clip.setData(trans,null,clipid.kGlobalClipboard);
}
}

function em_size(str) {
var a = document.getElementsByName(str);
var n = a.length;
try {
var input_checkall = document.getElementById("checkall_"+str);
var size = 0;
input_checkall.checked = true ;
for (var i=0; i < n; i++) {
if (a[i].checked) {
var piecesArray = a[i].value.split( "|" );
size += piecesArray[3]*1;
} else {
input_checkall.checked = false;
}
}
test = document.getElementById("size_"+str);
test.innerHTML = gen_size(size, 3, 1);
} catch (e) {

}
}

function gen_size(val, li, sepa ) {
sep = Math.pow(10, sepa); //小数点后的位数
li = Math.pow(10, li); //开始截断的长度
retval = val;
unit = 'Bytes';
if (val >= li*1000000000) {
val = Math.round( val / (1099511627776/sep) ) / sep;
unit = 'TB';
} else if (val >= li*1000000) {
val = Math.round( val / (1073741824/sep) ) / sep;
unit = 'GB';
} else if (val >= li*1000) {
val = Math.round( val / (1048576/sep) ) / sep;
unit = 'MB';
} else if (val >= li) {
val = Math.round( val / (1024/sep) ) / sep;
unit = 'KB';
}
return val + unit;
}
[/php]

第三步:后台添加Discuz!代码

标签:emule
替换内容:(无)
例子:[emule]下载地址[/emule]
解释:添加 eMule 电驴下载
参数个数:1
参数提示:使用emule标记,可以使输入的ed2k地址以超链接的形式在帖子中显示。
嵌套次数:1
图标:bb_emule.gif

上传文件,更新后台缓存,升级完毕!

最近在折腾自己的网站DV站,打算装个相册上去。

终于找到相册程序了,但都是GB2312编码的。鉴于网站都是UTF-8的,只好用UltraEdit手工转码。

但是,转成UTF-8的程序上传到服务器之后却频频白屏。setcookie和header均出错。这肯定是在header之前有数据输出。

用IE查看源代码,一无所获。用FireFox查看源代码,发现有6个无法显示的空字符。这才想起来是不是编码的问题。

Google了一下,UTF-8用BOM(Byte Order Mark,字节顺序标记)标记字节顺序。BOM一般加在文件头,长度三字节(EF BB BF)。如果程序发现BOM,则自动按照UTF-8处理。

问题就出在BOM上面。PHP是不支持BOM的,所以PHP在处理文件的时候会把BOM直接输出,也就导致了header之前存在输出,从而setcookie和header不起作用。

知道问题,解决起来也不难了。用UltraEdit将文件保存为“UTF-8 无 BOM”就行了。

有时候面对多个事件同时发生,却没有足够的资源去处理全部事件,或者无需全部处理,这时就要引入“优先事件”的概念。

举个例子,假设现在有一个请求指令同时包含如下错误:

  1. 校验检测错误(ECC error或者parity error)
  2. 无效操作代码(Illegal opcode)
  3. 无效地址(Invalid address)

而系统规定:

  • 如果出现无效操作代码,则抛弃当前指令并引发中断;
  • 如果操作代码正确,但地址错误,则记录错误地址并引发中断;
  • 如果操作代码和地址均正确,ECC错误,则向源设备返回错误信号。

按照正常思路,这段错误处理代码大致如下:
[code lang="verilog"]
if (ill_opcode) // Illegal opcode
begin
interrupt = 1'b1;
end
else if (inv_addr) // Invalid address
begin
rec_addr <= addr;
interrupt = 1'b1;
end
else if (ecc_err) // ECC error
begin
err_resp = 1'b1;
end
else
...
[/code]
这么写虽然没什么毛病,但是如果这样简化一下,既可以提高可维护性,又能达到同样的效果。
[code lang="verilog"]
case(1'b1)
ill_opcode: interrupt = 1'b1; // Illegal opcode
inv_addr:                     // Invalid address
begin
rec_addr <= addr;
interrupt = 1'b1;
end
ecc_err: err_resp = 1'b1;     // ECC error
default: ...
[/code]

10月9日消息,新浪科技日前获得了一份由中国科学院计算技术研究所与意法半导体公司编写的《龙芯2E处理器数据手册》,其间详尽披露了龙芯处理器的技术细节。

意法半导体代工龙芯2E

由于中科院计算所授权意法半导体制造龙芯2号,故处理器上有“ST”字样。

龙芯2E微处理器是一款实现64位MIPSⅢ指令集的通用RISC处理器,采用90nm的CMOS工艺,布线层为七层铜金属,芯片晶体管数目为4700万,芯片面积68mm×52mm,最高工作频率为1GHz,典型工作频率为800MHz,实测功耗5-7瓦。

龙芯2E具有128KB一级缓存、512KB二级缓存,单精度峰值浮点运算速度为80亿次/秒,双精度浮点运算速度为40亿次/秒,在1GHz主频下 SPEC CPU2000的实测分值达到500分,综合性能已经达到高端Pentium Ⅲ以及中低端Pentium 4处理器的水平。

龙芯2E改进空间还很大

DIY爱好者都熟知,二级缓存非常影响处理器的性能。

与早期的Pentium Ⅱ处理器类似,龙芯2E二级缓存的频率为处理器主频的一半。龙芯技术人员坦言,处理器达到1GHz的频率并非易事,半速运行主要考虑降低对延迟的要求,当时团队没有充裕的时间来设计一个足够快的512KB缓存。

此外,PCI总线有限的带宽也严重制约了系统性能。从目前的开发样板来看,VIA(威盛)南桥提供的外设接口有些过时,且PCI总线扩展增加了成本。

龙芯2C并未批量生产,首批推向市场的龙芯盒子会采用龙芯2E,而性能更为优良的龙芯2F也在酝酿之中。进步的细节诸如龙芯2E目前最高支持 DDR333,而龙芯2F将支持DDR2,且处理器会集成PCI-X或者PCI-Express,芯片组方面也有一些计划做大幅度的改进。

中科院计算所所长李国杰院士称,龙芯2F的性能将比龙芯2E提高20%至30%,并有望年底进行流片。

三大系列龙芯并行发展

龙芯1号处理器及其IP系列主要面向嵌入式应用,龙芯2号超标量处理器及其IP系列主要面向桌面应用,龙芯3号多核处理器系列主要面向服务器和高性能机应用。

根据应用需要,其中部分龙芯2号也可以面向部分高端嵌入式应用,部分低端龙芯3号也可以面向部分桌面应用。以后上述三个系列龙芯处理器将并行地发展。

[caption id="attachment_111" align="alignnone" width="450"]110_godson2e_news_101001.jpg 龙芯2E处理器,上有ST即意法半导体的LOGO[/caption]

[caption id="attachment_112" align="alignnone" width="450"]111_godson2e_news_101002.jpg HSBGA452封装的龙芯2E处理器[/caption]

 

2001年5月,在中科院计算所知识创新工程的支持下,龙芯课题组正式成立

2001年8月19日,龙芯1号设计与验证系统成功启动linux操作系统

2001年10月10日通过由中国科学院组织的鉴定

2002年8月10日,首片龙芯1号龙芯XIA50流片成功

2002年9月22日龙芯1号通过由中国科学院组织的鉴定

2002年9月28日举行龙芯1号发布会

2003年10月17日,龙芯2号首片MZD110流片成功

2004年9月28日,经过多次改进后的龙芯2C芯片DXP100流片成功

2005年1月31日举行了由中国科学院组织的龙芯2号鉴定会

2005年4月18日在人民大会堂召开了由科技部、中科院和信息产业部联合举办的龙芯2号发布会

2006年3月18日,龙芯2号增强型处理器CZ70流片成功

原文链接:http://www.pconline.com.cn/desktops/testing/0703/982201.html

前言

在IT领域,CPU作为一项核心技术,其难度让很多国内IC设计公司望而却步,从方舟诞生再到汉芯造假,中国人民在这场科技的浪潮中不断经历着期望与失望的更迭。就在这时,“龙芯”这个全新的名词又闯入了人们的视线,质疑声,甚至是谩骂声一时间此起彼伏,给这个刚刚平静不久的中国芯市场又掀起了不小的波澜。

中国研发CPU只有短短不到十年的时间,与国际巨头相比,还有很长的路要走,但是这丝毫不影响科研人员对国产CPU研发的热情,而“龙芯”正是在这种热情与执着的追求下诞生的,对于中国的芯片产业来讲,龙芯还只是个孩子,他需要的更多的是人们的包容与关怀,面对外界的质疑,“龙芯”的父母们也一直保持着低调的姿态,他们坚信产品会是一个最好的证明!更多内幕请关注PConline产业资讯栏目独家大型专题《中科院计算所龙芯研发基地完全探密》。

而龙梦盒子正是采用了龙芯处理器,这也是我国第一台拥有自主知识产权的电脑。对于首批测试用户实行1599元的预售价,相信其正式上市的价格也不会与此相差太远。今天,就让我们来一起揭开这个让众多人期盼已久的神秘盒子的面纱!

阅读全文 »

片名:留学加拿大 之 情深意重

主题:留学生是一群特殊而又普通的群体。
普通,是因为我们和普通人一样都在上学。
特殊,是因为我们不但承担了学习的压力,
生活也是我们的重要部分。
我们离开了父母,开始了自立的生活。
在这生活背后的酸甜苦辣,我们要独立体会。

夏天的新片,一触即发。

3月10日之前,确定素材/剧本。
3月24日之前,确定演员。
3月24日,第一次剧组会议。
5月12日之前,拍摄前期准备,剧本、设备、道具就位。
5月12日,开始拍摄。
6月30日,最后一次拍摄,开始后期剪辑。
8月18日,剪辑完成,开始后期合成、制作字幕。
9月1日,发布,庆祝蓝色蒲公英一周年。

在SMC拍摄过程中,我也算是过了回导演瘾。
当时的感想就一个字——累。
每天到拍摄场地之后总不能闲着。
要给演员说戏,提醒他们背台词。
要布置场景,选择拍摄机位。
要组织大家工作,至少不能让他们闲着。
后来发现,台词我背得比演员都熟练。

SMC过后,静下心来仔细想了想,不足之处太多了。
首先是剧本,这个剧本没有意义啊,不知道要表现什么。
然后是导演,大多数地方都没有很好的体现剧本的意思。
后期也是个问题,有很多效果都没做出来。
还有演员的现场发挥,根本就没有现场发挥,太死板。

看过了《爱情呼叫转移》的拍摄过程花絮。
其中的亮点,就是演员的现场发挥。
其实有很多编剧遗漏的小细节,
如果演员发挥得好,就是对影片的锦上添花。
导演不是万能的,但是在场景设计上一定要全力以赴。
专业的导演事先会勾画出场景草图,这对于我们太难了。
但是,合理利用场景、灯光、道具,会给影片增色不少。
导演一定要参加后期剪辑,以保证故事是按照导演的思想进行的。
编剧是影片关键所在。
一部片是好是坏,主要取决于故事性,其次才是叙事手法。
镜头的灵活运用,属于画龙点睛之笔,可以让电影生动活泼。

有这么一种说法,在DV普及了之后,谁都可以拍片子了。
的确是这样,但是拍好拍坏就是另外一回事了。
SMC可以理解为一个失败的作品,但是却是一个里程碑。
SMC实现了从无到有,并且给我个人积攒了大量的经验。

总结了这么多,还都是停留在理论层面。
等着夏天,在新片中实践一下。

下了决心去做,就要做出我们的特点。
不能一味跟在别人屁股模仿。
模仿的再像,也只是别人的影子而已。

片头一共1分30秒,背景音乐初步定下来选用Over the Hedge里面的《The Family Awake》。

三人出门,大概10秒

(以下三人路线穿插进行)

高岱路线:
上车
开车
高速公路(三秒慢镜头)
Rideau街
国会山
进校园
下车进楼

郭凡路线:
Rideau街公车站上7路车
7路车上跟拍
Bank Street街景
7路车进校园
下车进楼

Kelly路线:
进Rideau Center
上电梯
The Body Shop
Mexx
等公车
转小火车
下车进楼

穿插点:
1、郭凡上7路,7路车后跟高岱车,7路车开走街对面出现Kelly
2、Kelly进每一家店的时候穿插到其他两人
3、每一组镜头后面都是穿插点

其他拍摄要点:
1、三秒慢镜头要三脚架
2、Kelly在商场里用侧面跟拍
3、郭凡在公车上拍正面镜头
4、高岱车上在后座拍摄
5、可能需要补加在公交车下拍郭凡的镜头

暂时先想这么多。

前几天看了《爱情呼叫转移》,不可多得的新片啊。
顺便看了一下导演日志,获益匪浅。
原来当导演也有很多技巧,或者说,需要一个高速运转的头脑。

以前从不知道,导演还需要绘制场景草图。
以前也不知道,导演需要合理安排演员的档期与拍摄进度。
……
看来做导演真不是一件容易的事。光有热情是远远不够的。

夏天,我打算启动蓝色蒲公英第二部电影。
在有了第一部电影的经验,加上之后加盟的几位王牌成员,
估计第二部片会比第一部片在质量上有很大的飞跃。

前天拿下了Sony HDR-HC3,设备不成问题。
策划还要加上Rick。不过这家伙夏天要回国,运作还要我一个人。
剧本,最近还没有什么好主意。看看高岱那里有没有什么好素材。
导演,我想启用新人。目前还没有什么好的人选。
演员,等剧本出来再说吧。只要到时候有人不回国就行。

目前确定的项目成员:
策划:Rick、我
前期准备:高岱
拍摄协助:高莹莹