石家庄幼儿师范的宿舍外贸宿舍有一则启事: 老记与二位贞查司令"关系处得比较费劲"。他希望向其它方面靠拢,……

&幼升小&:为了入学 户口异地父母&扎堆&离婚!今天是日,每日新闻来了![万事通关系网]
石家庄\"幼升小\":为了入学 户口异地父母\"扎堆\"离婚来源: 中国青年报(北京) “平时也就五六对,前天我们办了18对。”7月4日,石家庄市裕华区婚姻登记处一位工作人员说起最近“扎堆”离婚的现象时坦言,“这两天离婚的人比平常多不少,有人说是为了孩子上学,别的我们也不好多问。” 中国青年报·中青在线记者调查发现,近日石家庄一些教育主管部门和学校在执行“幼升小”政策时要求:父母和孩子3个人的户口必须在一处才能上片内学校,否则只能接受调剂。为了孩子在片内入学,一些夫妻二人中有一方户口没在片内的,为此去办了离婚手续。 7月4日,石家庄市教育局工作人员在接受中国青年报记者采访时则回应称:“我们的政策只写着‘随父母’。” 父母孩子三人户口缺一不可7月4日,为了向记者准确解读2018年石家庄“幼升小”政策,石家庄桥西区某小学负责招生工作的一位副校长专门找出了石家庄市和桥西区教育主管部门下发的文件。“要求适龄儿童、少年户口随父母,且户口和住址符合户籍管理有关要求,即户口、住址和父母的《房屋所有权证》或《不动产权证书》(规划用途须为住宅)相一致。”她指着文件强调,户口本和房产证一致的享受“划片招生,免试就近入学”政策,而不符合该要求的,由区教育局根据适龄儿童、少年家庭实际情况和各学校学位情况调剂安排入学。对于文件中提到的“随父母”是指“父和母”还是“父或母”,这位副校长肯定地告诉记者:是指父亲和母亲。在当地实际招生工作中也是按“父和母”的标准来执行的,上片内学校,父母和孩子三人户口缺一不可,否则就要接受调剂。 这位副校长介绍说,石家庄市的小学根据报名孩子情况将招生名单进行排序。孩子和父亲、母亲三人户口、住址和《房屋所有权证》或《不动产权证书》相一致的排在最前面。排在其后的是按照规定享受“优惠政策”的——孩子的父母一方为独生子女的,且孩子随父母在祖父母或外祖父母处落户,常年同住,无户口迁移史的,其祖父母或外祖父母(独生子女一方)的房产在招生片区的。按照规定,这两种情况是学校必须划片招生,免试就近入学。 孩子父母双方只要有一方的户口不在招生片区,就要和户口不在片区但家庭在招生片区有房产、在招生片区租房居住且户口也不在片区等情况的孩子一样,排在前两种情况之后,“做好服从调剂的准备”。 据介绍,石家庄小学录取时,将根据片区小学招生人数,按排序情况从前向后录取。“没有被所在片区小学录取的,将由区教育局统筹,在该区有空余学位的小学录取。” “今年入学的孩子恰好属龙,比前后届的孩子人多。”这位副校长对记者表示:她所在小学本计划招生4个班,最终增加至5个班,但学位依然“供不应求”。 这位主管招生工作的小学副校长告诉记者,石家庄“幼升小”招生政策都是这么执行的。 户口异地夫妻“扎堆”离婚 当记者询问父母离异的孩子在招生中“随父母”这一点如何界定时,石家庄桥西区负责招生工作的这位副校长坦言:“很多人咨询时都问到了这一点。”她解释说,父母离异的孩子和监护人的房产户口都在招生片区的即可免试就近入学。“但这种情况要提供离婚证。”她强调,“招生工作要以证件为依据。” 事实上,为了孩子能在片区内学校顺利入学,一些夫妻两人中有一方户口没在片区内的办了离婚手续,拿到了离婚证。家住石家庄桥西区的王虹(化名)近日带着孩子去石家庄桥西区某小学报名。她和孩子的户口在该小学片区内,但孩子父亲的户口在外地。 “现场有两种表格,符合条件的就直接报名,不符合条件的只能填调剂入学表格。” 王虹被告之要调剂入学。 在报名现场,像王虹这种情况的就有几家。一对夫妻因为孩子被调剂入学还在现场吵了起来。“一位老年妇女就给他们出主意:办个‘假离婚’,就能顺利在片内入学。”这位老年妇女告诉王虹,她的儿子和儿媳就是这么做的。 7月3日下午,一位家长告诉记者,为了孩子能顺利就读石家庄市长安区某小学,她和户口在外地的丈夫当天上午刚刚去办了离婚手续。“我们这片类似情况都是这么做的,我们没办法,也只能这么做。” 她告诉记者,在婚姻登记处办离婚时,前面排了四五对。“大部分都说是为了孩子上学来离婚的。”她也向记者证实,离婚后,需要给学校提供离婚证明。“现在我们已经顺利报名了,等19日拿到孩子入学通知,我们就复婚。” 7月4日下午,记者联系了石家庄市长安区婚姻登记处。一位工作人员介绍说,近两天离婚的人明显增多。“人数增加了一倍,之前每天也就十来对,这两天多的时候有20多对。”据他观察,离婚的人以30多岁的年轻人居多。 记者随后又拨打了裕华区婚姻登记处等,得到的回答也是如此。“我们的政策只写着‘随父母’” 7月3日下午,中国青年报·中青在线记者拨打了石家庄市教育局在媒体上公布的招生咨询电话。接电话的工作人员称,招生划片学生和父母三人户口必须在一起,不仅如此,不动产权和常住地址也要一致,否则就需要调剂入学。记者注意到,2017年,石家庄市长安区教育局基础教育科时任科长在接受媒体采访解读“幼升小”政策时也曾表示:“父母双方户口,必须全在一起,如果有一方的户口不在这里,需要调剂入学,调剂的原则是如果就近的学校有空余学位,就在就近的学校,如果学位已经满了,调剂到相对较近的学校入学。” “我们的政策没有写这么细,只写着‘随父母’,从来没有说户口一定要随父母双方。”7月4日上午,石家庄市教育局基础教育处一位工作人员这样对记者解释。义务教育招生以区县为主,不同区县和学校的政策不太一样。“有些学校就要求孩子户口必须随父母双方,也有些学校要求随父母一方即可。”他补充说。 河北大学教育学院教授薛国凤分析指出,教育资源的短缺,特别是优质教育资源的不均衡催生了这类现象。“或许教育主管部门有不得已的苦衷,片区内孩子太多,容纳数量有限,不得不采取这样‘极端’的措施。”薛国凤认为,在所有人都想吃蛋糕,而且分蛋糕者也想让人人都吃到蛋糕的情况下,就必须考虑根本问题——做一个更大更好的蛋糕,而不仅仅是绞尽脑汁去想如何切这块蛋糕。 “是管控,是领导,还是服务?”她同时指出,目前一些教育行政管理理念已不能满足教育发展需要。“一些部门的管理者也该与时俱进,更新观念,以适合并能推动事物发展的理念去探索工作如何高质量、高满意度开展。”陕西省企业退休人员基本养老金14连涨 7月底前发放到位
本报讯(记者郭欣)记者从省人社厅获悉,从今年1月1日起,我省对日前按规定办理了退休手续的企业和机关事业单位退休人员(含退职人员,不含新中国成立前参加革命工作享受本人原工资100%退休金待遇的老工人)的基本养老金(含退职生活费)进行调整提高。西安全面部署景区酒店、旅行社文明旅游工作  为动员旅游行业进一步增强责任意识、文明意识、安全意识,带头遵守文明旅游的相关规定,监督和纠正各类不文明行为,结合暑期来临的旅游旺季安全生产工作,昨日下午,市旅发委召开全市旅游行业文明旅游暨安全工作推进会,全面部署景区、酒店、旅行社文明旅游工作,来自30多家酒店、60余家旅行社以及100余家旅游景区相关负责人参加会议。高考录取现场今年首次实行“刷脸”入场
西安新闻网讯(记者 任娜
司文)7月5日是2018年陕西高考录取正式开始的第一天。我省提前批文史、理工类本科,体育、艺术类本科的录取拉开帷幕。记者从省招办了解到,今年高考录取现场依然分为会务组,计划组,信息组,录检组。打印组,纪检信访组等六个工作小组。
同时为了进一步加强高考录取现场的安防工作,今年首次实行“刷脸”入场。所有人员必须通过人脸识别录检后方能进入录取现场。西安制定《地铁工程建设突发事件应急预案》
西安新闻网讯(记者 康乔娜
张端)为建立健全西安市地铁工程建设突发事件应急机制,及时、有序、高效处置地铁工程建设施工过程中可能发生的各类事件,最大限度减少人员伤亡、财产损失以及不良社会影响,我市制定《地铁工程建设突发事件应急预案》。陕西省出台意见促进全域旅游发展 景区与城市将实现“零换乘”
昨日记者获悉,我省《关于促进全域旅游发展的指导意见》正式发布,到2020年,全域旅游示范省创建成功;国际一流文化旅游中心和“一带一路”旅游核心区地位基本确立;丝绸之路起点旅游走廊、秦岭人文生态旅游度假圈、黄河旅游带和红色旅游系列景区等“四大旅游高地”竞争力和影响力显著提升。全省旅游接待人数力争突破7.3亿人次,城乡居民人均出游4.5次,旅游总收入达到7700亿元,旅游业增加值占GDP比重达到9.2%。28座车站精装即将收尾 综合联调全面启动
西安新闻网讯(文/记者 高乐 图/记者
张宇明)简约大气而又充满中国风的车站、清新绿色的座椅和扶手、鲜明黄色的爱心座位……7月5日,记者试乘了备受市民关注的西安地铁四号线。目前,该线路综合联调工作已全面启动,2018年年底将开通试运营。西安今起雨暂停8日还有降雨 城区近50个路段积水  昨天早上,西安的雨越下越大,西安市气象台6时20分发布暴雨蓝色预警信号,8时发布雨情通报:3日7时至4日7时,西安市普降中到大雨,局地暴雨。长安区、蓝田县、临潼区、灞桥区、碑林区南门盘道、雁塔区大唐芙蓉园等达到30毫米以上,其中加密雨量最大为临潼区铁炉54.1毫米。防汛避灾进行时 省市各部门夜以继日工作确保安全度汛
连日来,西安市政防汛人员昼夜不息,巡视路段、及时排除积水。市水务部门则实行汛期24小时值班制度,保水库水电站安全运行。各部门夜以继日工作,旨在确保群众生活有序,安全度过汛期。西安人造雾扮靓曲江池西路 街头小景似幽谷仙境  西部网讯(记者魏永贤)西安曲江池西路,这几天刚调试好的人工造雾装置正在喷雾,假山、怪石、奇松、花草、云雾组成的街头小景仿佛成了云雾缭绕的幽谷仙境。北京市中轴线申遗:确定人民英雄纪念碑等14处  昨天(3日),由市政府办公厅和市政协提案委员会联合主办的“市民对话一把手·提案办理面对面”直播访谈节目中,市文物局局长舒小峰透露,中轴线申遗坚持“保护为主、科学管理”的理念,确定了永定门、先农坛、天坛等14处遗产点,力争在2030年基本达到申遗要求,确保到2035年内实现申遗目标。同时,中轴线“提亮”工程将通过货币补偿、配给保障房、就近平移等降低人口密度,改善基础设施,努力留住老北京、老街坊,腾退文物将最大限度开放。大熊猫疑因暴雨致山洪暴发落水溺亡 网友“泪目”
被发现于四川黑水河自然保护区一河滩处,疑因暴雨导致山洪暴发落水溺亡
新京报记者昨日从成都市林业局获悉,四川黑水河自然保护区内发现一只死亡的大熊猫幼崽,经判断可能因暴雨导致山洪暴发,该大熊猫幼崽不慎落水溺亡,后随洪水冲至河岸浅滩处被发现。 “胃里有奶让人难受,熊猫妈妈再也见不到宝宝了……”因溺亡大熊猫只有半岁,检查时发现其胃里有奶,网友直呼心疼。专家表示,应尽力改善野生大熊猫的栖息地,使其野外生存环境得到有效保护。盗墓团伙拜师学艺成\"专家\" 为证文物为真直播盗墓
和田玉扳指、清朝官服、金丝楠木……长沙县公安局办公室桌上,满满一桌造型精美的古文物,足以开个小型展览会。然而,桌子一角的洛阳铲、钳子、铲子、金属探测仪等,似乎又在表明,这些文物“来路不明”。 6月29日,长沙县公安局刑侦大队联合安沙、湘龙、北山、高桥派出所,摧毁一盗掘古墓葬团伙,刑事拘留9人,破获系列古墓被盗案,其中包括黄兴之父等古墓。医生因科室医保经费超标被扣钱 仅拿1千元绩效奖金
浙江省某市肿瘤医院医生陈明红今年2月份又只拿到了1000元的绩效奖金。最近半年来,因他所在的呼吸内科医保经费超标,全科的人都被扣钱,奖金只能按保底金额发放。贵州遵义2名考生高考志愿被冒填 室友自首称想给他们点教训  近段时间,各省高考志愿网上填报工作正在陆续进行,在贵州省遵义市播州区,高考考生廖某在网上填报志愿时却发现,自己的高考志愿已在系统中被他人填报了,并且系统锁定不能再进行修改,廖某立即向当地警方报案。俄罗斯对英国再现疑似神经毒剂中毒事件表示关切  新华社莫斯科7月5日电(记者安晓萌)俄罗斯总统新闻秘书佩斯科夫5日说,俄罗斯对英国威尔特郡埃姆斯伯里地区发生疑似神经毒剂中毒事件表示关切。阿斯塔纳国际金融中心正式开业
哈总统冀其名列亚洲前茅  中新社阿斯塔纳7月5日电 (记者
文龙杰)阿斯塔纳国际金融中心当地时间5日正式开业,哈萨克斯坦总统纳扎尔巴耶夫出席了当天的开业典礼。两艘船只在普吉岛倾覆:船上有中国游客
7人下落不明  中新网7月5日电
据美联社报道,泰国普吉岛警方5日称,两艘船只当天在普吉岛附近海域倾覆,造成至少7人失踪。据称,这两艘船共搭载超过130名游客,其中包括中国游客。外媒:一艘载90人船只在泰国普吉岛倾覆
数十人失踪  中新网7月5日电
据外媒报道,泰国普吉岛防灾减灾办公室于当地时间5日晚间称,一艘载有90人的船只在普吉岛附近海域倾覆,造成数十人失踪。防灾减灾办公室称,这艘船发生倾覆时正载有90人,半数人获救,救援行动仍在进行中。韩朝统一篮球赛结束
朝方为韩国队举行送行晚宴  中新网7月5日电
据韩联社报道,7月5日,韩朝统一篮球赛迎来第二个比赛日,韩朝双方先后举行女子队和男子队比赛。韩国队在女队比赛中获胜,朝鲜队则在男队比赛中取胜。美国智库:美国有可能成为“超级流氓大国”  7月4日是美国“独立日”,当欢庆的烟花照亮美国的夜空时,面对着日趋严重的政治和经济两极化,一向自豪骄傲的美国人民是否还能一如既往地为他们的例外主义而骄傲自豪呢?答案似乎并不太乐观。金砖国家经贸部长会议就反对单边、保护主义等发表声明  日,金砖国家第八次经贸部长会议在南非约翰内斯堡举行。会议重点讨论了单边主义和保护主义措施对多边贸易体制和全球经济造成的影响。会议发表了有关支持多边贸易体制、反对单边主义和保护主义的单独声明。逾40国在WTO抗议美国威胁加征汽车关税计划  中新社北京7月5日电
综合消息:包括日本、俄罗斯、欧盟各国在内的40个国家近日在日内瓦世界贸易组织(WTO)总部举行的货物贸易理事会上表示,对美国威胁针对进口汽车和零部件加征关税的做法表示反对和质疑。秦皇岛迎来今夏首班国际旅游包机
有望年达百班  中新社石家庄7月5日电 (陈林
龙岩)日渐进入旅游旺季的国际知名旅游城市河北秦皇岛,近期也吸引着境外游客的“组团”游。河北机场管理集团有限公司5日透露,今夏首班俄罗斯旅游包机日前已抵达秦皇岛北戴河机场,今夏该机场开通的国际旅游航线包机有望达到100班。中国欧盟商会:看好中国西南地区的发展潜力  中新社成都7月5日电
(岳依桐)中国欧盟商会联合罗兰贝格咨询公司5日在成都共同发布2018年《商业信心调查》年度报告。中国西南地区的发展环境及潜力获得好评。甘肃嘉峪关深耕“丝路资源”
荐“工业+旅游”招揽客商  中新网兰州7月5日电 (记者
崔琳)“伴随‘一带一路’建设深入实施,丝绸之路经济带重要节点城市嘉峪关市雄厚的工业基础、丰富的旅游资源、开放文明的城市环境必将转化为极具竞争力的资本优势、市场优势和经济优势。”5日,第二十四届兰洽会嘉峪关市招商旅游推介会暨项目签约仪式在兰举行,当地官方向各地客商力荐该市“工业+旅游”禀赋。第五届中国(东北亚)森林博览会在伊春开幕  中新网伊春7月5日电 (记者
魏来)5日晚,第五届中国(东北亚)森林博览会(以下简称伊春森博会)在伊春开幕。来自俄罗斯、日本、韩国等10个国家近700家企业参展。武汉警方摧毁跨省“酒托”诈骗集团抓获疑犯近百人  中新网武汉7月5日电 (王威 唐时杰
徐金波)网上楚楚动人的“美女”,实际却是膀大腰圆的赤膊壮汉。武汉市公安局江岸区分局5日通报,经过两个多月的缜密侦查,近期摧毁一个特大跨省“酒托”
诈骗犯罪集团,在湖北、广东、陕西、福建等地,抓获以曹某为首的犯罪嫌疑人94名,冻结涉案资金258万元。四川供销合作社联合社党组书记青理东接受审查调查  中新网成都7月5日电
(张浪)四川省纪委监委5日消息:四川省供销合作社联合社党组书记、主任青理东涉嫌严重违纪违法,目前正接受纪律审查和监察调查。山西开展焦化行业整改回头看:严查假整改欺上瞒下  中新网太原7月5日电
(任丽娜)“严厉打击弄虚作假、敷衍应付的行为”“对虚假整改、虚假验收的实施严肃问责”“存在假整改,欺上瞒下行为的,严肃问责党委和政府主要领导”……5日,记者从山西省环保厅获悉,山西省大气污染防治工作领导组办公室决定在全省开展焦化行业环保整改达标排放“回头看”专项行动。半日内逾3万辆外地车违反广州“开四停四”措施  中新网广州7月5日电 (记者
程景伟)广州市公安交警部门5日晚通报,《广州市公安局交通警察支队关于非广州市籍中小客车通行管理措施的通告》已于7月1日正式实施。7月5日零时至12时,广州全市电子警察设备监测到违反《通告》的非广州市籍中小客车3万多辆。广州警方侦破涉案额逾2亿元假药案  中新社广州7月5日电 (记者
程景伟)据广州警方5日晚通报,警方近期侦破一宗涉案额超过2亿元人民币的假药案件。据警方介绍,5月24日,在广东省公安厅指导以及广州市食品药品监管部门的支持下,广州警方对一起生产销售假药案开展统一收网,兵分多路奔赴广州市天河区、白云区及佛山市等6个涉案窝点同时进行查处,抓获犯罪嫌疑人16人,依法刑事拘留10人,查扣作案车辆3辆,查获用于生产假药的搅拌机、烘干机、自动化包装机等机器、生产模具一大批。海南万宁小型飞机失事致1死1失踪
仍在搜救  中新社海口7月5日电 (尹海明
王蕾)记者5日从海南省万宁市消防部门获悉,海南一架水陆两栖小型飞机7月4日下午在例行飞行训练时失事坠入万宁水库中,致两名飞行人员一死一失踪。截至5日18时许,失踪人员仍未找到,万宁市相关部门仍在全力搜救。现代粤剧《风雨骑楼》在澳门上演
展现广西梧州商埠变迁  中新网澳门7月5日电(记者 龙土有
杨陈)7月5日晚,应澳门龙腾粤剧团邀请,广西粤剧团、梧州粤剧团大型现代粤剧《风雨骑楼》在澳门永乐大戏院上演。该演出是庆祝广西壮族自治区成立60周年港澳系列宣传文化活动之一,旨在感谢长期以来关心支持广西经济社会发展的澳门同胞。香港年金公司推出终身年金计划
发行额度或倍增至200亿港元  中新社香港7月5日电(记者
陈逸舟)香港年金公司5日正式推出名为“香港年金计划”的终身年金计划,面向65岁或以上的香港永久性居民,如果获得超额认购,首次发行额度将由目前的100亿元(港元,下同)倍增至200亿元。UIC开展授课型硕士学位教育
学成可获颁香港硕士学位  中新网珠海7月5日电 (邓媛雯
杨炜民)今后在珠海读研也可获颁香港硕士学位。记者5日从北京师范大学—香港浸会大学联合国际学院(以下简称“UIC”)获悉,该校将正式在专业会计、传播学两个专业开展授课型硕士学位教育,符合毕业要求的学生将被颁发香港浸会大学硕士学位证书。这两个专业预计于9月底开课,现已启动首届申请入学。澳门一教学助理利用学校设施造假钞
总值30万澳门币  中新网7月5日电
据香港《星岛日报》网站报道,澳门司警日前拘捕1名在公立教学机构任职教学助理的澳门男子,其涉嫌大量伪造500元(澳门币,下同)钞票,总值约30万元。司警相信他是利用在学校的教学设施伪造假钞。刘结一警告“台独”:民进党当局在危险的道路上越滑越远  7月5日,第11届津台投资合作洽谈会暨2018年天津·台湾商品博览会开幕,国台办主任刘结一出席开幕仪式并致辞。国台办官网5日下午公布了刘结一致辞全文。在致辞中,刘结一首先回顾了2008年以来津台会规模不断扩大的过程以及本届津台会将展示的众多新举措。台湾扩大“限塑”:约七成顾客不会购买塑料袋  中新社台北7月5日电
从今年元旦起,台湾实施扩大购物用塑料袋管制范围。台环保主管部门最新统计1至4月稽查状况后表示,约有七成顾客不会购买塑料袋。调查:台湾职场“快闪族”
45至50岁年龄段比例高  中新社台北7月5日电
台湾人力资源机构7月5日发布的一项调查显示,从年龄交叉分析,台湾45至50岁的上班族在一个月内离职比例最高,颠覆以往年轻族群频于换工作的刻板印象。郝龙斌:“两岸一家亲”
深化民间交流和经贸往来  中新社天津7月5日电 (记者
张道正)中国国民党副主席郝龙斌5日在天津表示,中国国民党愿以“两岸一家亲”“两岸一家人”为基础,深化民间交流和经贸往来,担起促进两岸和平繁荣、振兴中华民族的共同责任。刘结一出席第11届津台会开幕式中新社天津7月5日电 (记者
张道正)7月5日,中共中央台办、国务院台办主任刘结一出席第11届津台投资合作洽谈会暨2018年天津·台湾商品博览会开幕式。  刘结一表示,我们秉持“两岸一家亲”理念,持续推出大量惠及台湾同胞的政策措施,为台胞台企在祖国大陆广阔天地实现更好发展创造条件。
股票推荐都是骗人的!
股票推荐都是骗人的!
股票推荐都是骗人的!
本站收集互联网各类数据, 结合股票历史情况, 对A股3000余只股票进行全量分析, 每天针对每只股票给出建议, 不推荐任何股票, 请结合自己的判断进行参考.
微信公众号:
官方淘宝店:********************************************************************************************************************
*作者:&Ian& &&时间:& 09:04& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & **标题:&菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &**所谓综合,就是把描述语言转化成能硬件实现的电路,学verilog的时候,没有人给我说要不要考虑能否综合的问题~~~& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & **看了5本书,居然没有一本书讲到能否综合,所以设计出来的程序完全不能用~~~ & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & **而且,书中都是讲语句的具体使用办法,例如always @(),但是什么时候用always,几个always之间、时序电路、逻辑电路、任务与函数什么时候用,却没有一本书能讲清楚。**这个笔记详细写了这些思路的问题,分享给新手看看,学习一种思路~~*点击此处下载&&(原文件名:verilog_经验(适合初学者).doc)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &*
********************************************************************************************************************
先记下来:1、不使用初始化语句;2、不使用延时语句;3、不使用循环次数不确定的语句,如:forever,while等;4、尽量采用同步方式设计电路;5、尽量采用行为语句完成设计;6、always过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号;7、所有的内部寄存器都应该可以被复位;8、用户自定义原件(UDP元件)是不能被综合的。一:基本Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器,还有可能被优化掉。二:verilog语句结构到门级的映射1、连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。2、过程性赋值:过程性赋值只出现在always语句中。阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。过程性赋值的赋值对象有可能综合成wire, latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。过程性赋值语句中的任何延时在综合时都将忽略。建议同一个变量单一地使用阻塞或者非阻塞赋值。3、逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门,一些操作符不能被综合:===、!==。4、算术操作符:Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。5、进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:Wire [3:0] A,B;Wire [4:0] C;Assign C=A+B;C的最高位用来存放进位。6、关系运算符:关系运算符:&,&,&=,&=和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。7、相等运算符:==,!=注意:===和!==是不可综合的。可以进行有符号或无符号操作,取决于数据类型8、移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。9、部分选择:部分选择索引必须是常量。10、BIT选择:BIT选择中的索引可以用变量,这样将综合成多路(复用)器。11、敏感表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。12、IF:如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。13、循环:只有for-loop语句是可以综合的。14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。15、不能在多个always块中对同一个变量赎值16、函数函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。17、任务:任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。18、Z:Z会综合成一个三态门,必须在条件语句中赋值19、参数化设计:优点:参数可重载,不需要多次定义模块四:模块优化1、资源共享:当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。2、共用表达式:如:C=A+B;& & D=G+(A+B);两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.3、转移代码:如循环语句中没有发生变化的语句移出循环.4、避免latch:两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。5:模块:综合生成的存储器如ROM或RAM不是一种好方法,只是成堆的寄存器,很费资源。最好用库自带的存储器模块。五、验证:1、敏感表:在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。2、异步复位:建议不要在异步时对变量读取,即异步复位时,对信号赋以常数值。Averilog的流行,有两方面的原因;B verilog与VHDL相比的优点C典型的verilog模块D verilog语法要点A) verilog的流行,有两方面的原因:1它是cadence的模拟器verilog-XL的基础,cadence的广泛流行使得verilog在90年代深入人心;2它在硅谷获得广泛使用;B) verilog与VHDL相比的优点二者的关系仿佛C与FORTRAN,具体而言:1 verilog的代码效率更高:比较明显的对比:VHDL在描述一个实体时采用entity/architecture模式,verilog在描述一个实体时只需用一个"module/edumodule"语句块.此外verilog的高效性还在很多地方体现出来;2 verilog支持二进制的加减运算:VHDL在进行二进制的加减运算时使用conv_***函数或者进行其他的定义,总之必须通知编译器;verilog直接用形如"c=a+b"的表示二进制的加减运算;3综合时可控制性好:VHDL对信号不加区分地定义为"signal",而verilog区分为register类型的和wire类型的;但是也有人支持VHDL,认为verilog和VHDL的关系仿佛C和C++.C)典型的verilog模块讨论以下典型电路的verilog描述:*与非门;*加法器;&&//即全加器* D触发器;*计数器; //**分频的counter**时序机;*RAM;& &//用synopsys的*模块引用;*预编译;*与非门的verilog描述如下://verilog使用和C语言相同的注释方法module nd02(a1,a2,zn);//一个verilog模块总是以module开始,以endmodule& &结束,nd02是模块名,a1,a2,zn是模块的3个输入输出信号input a1,a2;&&//告诉编译器a1,a2对此模块而言是输入,并且数据类型是"bit"&&//告诉编译器zn对此模块而言是输出,数据类型也是"bit"nand&&(zn,a1,a2); //我理解nand是运算符,我们不必深究verilog中的正式术语是什么了吧,总之这种形式表示zn=~(a1 && a2);你一定已经想到类似的运算符还有"not","and","or","nor","xor"了吧;除了"not",括号里的信号数可以任意,例如or (z,f,g,h)表示z=f || g || h,并且延时是3个单位时间,#x表示延时x个单位时间;endmodule*加法器的verilog描述如下:module ad03d1(A,B,CI,S,CO) ;input [2:0] A,B;&&//表示A,B是输入信号,并且是3位矢量,上界是2,下界是0input CI;output [2:0] S;output CO;assign {CO,S}=A+B+CI;//一对"{"和"}"表示链接,即将CO和S合并成4位矢量endmodule*带异步清零端的D触发器的verilog描述如下:module dfctnb (d,cp,cdn,q,qn);input d,cp,output q,reg q,& & //关键字"reg"表示q和qn是"register"类型的信号;verilog中有两种类型的信号:"register"类型和"wire"类型.你可以简单地把register类型的信号想象为某个D触发器的输出,而wire类型的的信号是组合逻辑的输出.二者的最大区别在于:你可以对register类型的信号进行定时赋值(用wait语句在特定时刻的赋值,详见下面always语句),而对于wire类型的信号则不可.always wait (cdn==0) //表示每当cdn=0时,将要对D触发器清零,"always"和"wait"嵌套,"wait"和"@"是verilog的两个关键字,表示一旦有某事发生;则执行下面的语句块,"always"有点象C语言中的"if ... then...","wait"和"@"的区别:请参考本模块.wait表示本语句块的进程停止,直到"cdn=0"的条件出现才继续;我理解在verilog中,每个最外层语句块都是一个***的进程;"@"(请看下个always语句)也表示本语句块的进程停止,直到后面定义"posedge cp"(即出现cp的上升沿)的事件出现才继续;也许wait和@可以合二为一吧,但至少到目前verilog中wait表示"条件",@表示"事件";具体运用中,wait总是用于类似"wait(xxx=1)"之类的场合,@总是用于类似"@(xxx)"或"@(posedge/negedge xxx)"之类的场合整句话的意思是"每当cdn等于0时,则作以下事情"begin& &&&//begin...end结构的用法类似于pascal语言& && & q=0;& && && &qn=1;& && &&&wait (cdn==1);endalways @ (posedge cp)//"@(posedge cp)"中有两个关键字:"@ (x)"表示"每当事件x发生","posedge x"表示"x的上升沿,"negedge x"表示"x的下降沿",整句话的意思是"每当cp的上升沿,则作以下事情"& && &&&if (cdn)&&//如果cdn=1(意味着清零端无效)& && &&&begin& && && && && &&&q=d;& && && && && &&&qn=~q;//"~"表示反相& && &&&endendmodule*计数器的verilog描述如下:module count(in,set,cp,out) ;//此计数器,在cp的上升沿将输入赋给输出,在cp的上升沿使输出加一input [15:0]input set,output [15:0]reg [15:0]always @ (posedge set)out =always @(posedge cp)out = out+1;&&//verilog容许一个信号同时出现在等号两端,只要它是reg类型的endmodule*latch的描述如下:always @(clk or d)& & if (clk) q =*时序机的verilog描述如下:always @(posedge CLK)&&//D是下一个状态,Q是当前状态,e1,e2是输入,a,b是输出Q=D;always @(Q or othercase) begin //当Q变化或输入e1,e2变化时D要相应变化D = Q; //note1a = 0;b = 0;......case(Q)&&q1:begin& &q1& &if(e1)D=d1;& &if(e2)D=d2;& &else D=d3;& &a = 1; //note 2& &end&&q2:begin& &b = 1;& &......& &end&&default:begin& &a = 0;& &b = 0;& &......endend---annotations---note 1:&&This is a custom expression,after reset,D should be equal to Q;note 2:&&In this state machine,a is only equal to 1 at state q1,in&&other state,a is equal to 0;* RAM的verilog描述如下:module ram(din,ain,dout,aout,rd,wr);//这是一个双口RAM,分别有:输入端:输入地址输入数据上升沿有效的写信号/输出端:输出地址输出数据高电平有效的读信号&&inout [7:0]&&input [7:0] ain,&&input rd,&&output [7:0]&&reg [7:0] memory [0:255];& &//请注意这是存储阵列的描述方法,描述了一个共有256个字的存储阵列,每个字是8位&&assign dout = rd ? memory[aout] : 8' //"assign"关键字表示并行赋值语句的开始"?"运算符的作用和在C语言中一样"8'bz"是一个常量,表示一个字节的高阻态,其中8表示长度是8bit,"'"是固定分割符,"b"表示后面的数据是以比特形式给出的,"z"表示高阻;举例:4'ha表示长4bit的数"1010"。类似的还可举出5'b等等&&always @(posedge wr)memory[ain] =endmodule*模块引用假设在前面(可以是别的模块)定义了module ram(din,ain,dout,aout,rd,wr),则引用此模块时只需写ram myram(din_in_map,ain_in_map,dout_in_map,aout_in_map,rd_in_map,wr_in_map);//其中"ram"是所引用的module名,"myram"是你起的instance名,"din_in_map"等等是图中的节点名,和器件(module)中的"din..."进行"虚实结合";*预编译类似C语言,只需写`include "&pathname:filename&",反上撇号"`"是verilog的预编译符,类似C中的"#".D) verilog语法要点*基本原则设计时应该把你的系统划分为计数器,触发器,时序机,组合逻辑等等可综合的单元,对此不同的IC公司和EDA开发商可能根据自己的见解和经验提出不同的要求,并且对verilog程序的细节进行自己的规定,但有一点是对的:即写硬件描述语言不象写C语言那样符合语法就行.单单符合verilog语法的程序可能被拒绝综合,甚至被拒绝模拟;*最外层可以写什么?这里所说的最外层是指module语句后的第一层,在这一层可以写这些可执行语句:assign和nand等定义组合逻辑的语句,always语句,模块引用语句,一些以"$"开头的系统定义语句.特别注意不可以写if语句.if语句只能放在always内部.不推荐写wait语句,因为不能综合.*不可以在多个always语句中对一个信号赋值.1.& & & & 强烈建议用同步设计2.在设计时总是记住时序问题3.在一个设计开始就要考虑到地电平或高电平复位、同步或异步复位、上升沿或下降沿触发等问题,在所有模块中都要遵守它4.在不同的情况下用if和case,最好少用if的多层嵌套(1层或2层比较合适,当在3层以上时,最好修改写法,因为这样不仅可以reduce area,而且可以获得好的timing)5.在锁存一个信号或总线时要小心,对于整个design,尽量避免使用latch,因为在DFT时很难test。6.确信所有的信号被复位,在DFT时,所有的FlipFlop都是controllable,7.永远不要再写入之前读取任何内部存储器(如SRAM)8.从一个时钟到另一个不同的时钟传输数据时用数据缓冲,他工作像一个双时钟FIFO(是异步的),可以用Async SRAM搭建Async FIFO。9.在VHDL中二维数组可以使用,它是非常有用的。在VERILOG中他仅仅可以使用在测试模块中,不能被综合10.遵守register-in register-out规则11.像synopsys的DC的综合工具是非常稳定的,任何bugs都不会从综合工具中产生12.确保FPGA版本与ASIC的版本尽可能的相似,特别是SRAM类型,若版本一致是最理想的,但是在工作中FPGA版本一般用FPGA自带的SRAM,ASIC版本一般用厂商提供的SRAM。13.在嵌入式存储器中使用BIST14.虚单元和一些修正电路是必需的15.一些简单的测试电路也是需要的,经常在一个芯片中有许多测试模块16.除非低功耗不要用门控时钟,强烈建议不要在design中使用gate clock17.不要依靠脚本来保证设计。但是在脚本中的一些好的约束能够起到更好的性能(例如前向加法器)18.如果时间充裕,通过时钟做一个多锁存器来取代用MUX19.不要用内部tri-state, ASIC需要总线保持器来处理内部tri-state,如IO cell。20.在top level中作pad insertion21.选择pad时要小心(如上拉能力,施密特触发器,5伏耐压等),选择合适的IO cell22.小心由时钟偏差引起的问题23.不要试着产生半周期信号24.如果有很多函数要修正,请一个一个地作,修正一个函数检查一个函数25.在一个计算等式中排列每个信号的位数是一个好习惯,即使综合工具能做26.不要使用HDL提供的除法器27.削减不必要的时钟。它会在设计和布局中引起很多麻烦,大多数FPGA有1-4个专门的时钟通道良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:&&(1) 对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写;&&(2) 使用有意义的信号名、端口名、函数名和参数名;&&(3) 信号名长度不要太长;&&(4) 对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;&&(5) 对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字;&&(6) 对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效;&&(7) 对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n;&&(8) 当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示;&&(9) 尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等;&&(10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;&&(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂;&&(12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;&&(13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力;&&(14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字;&&(15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:&&输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals;&&(16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误;&&(17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;&&(18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数;&&(19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复;&&(20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准;&&(21)在设计中不要直接使用数字,作为例外,可以使用0 和1。建议采用参数定义代替直接的数字。同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系;&&(22)不要在源代码中使用嵌入式的dc_shell 综合命令。这是因为其他的综合工具并不认得这些隐含命令,从而导致错误的或较差的综合结果。即使使用Design Compiler,当综合策略改变时,嵌入式的综合命令也不如放到批处理综合文件中易于维护。这个规则有一个例外的综合命令,即编译开关的打开和关闭可以嵌入到代码中;&&(23)在设计中避免实例化具体的门级电路。门级电路可读性差,且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。如果必须实例化门电路,我们建议采用独立于工艺库的门电路,如SYNOPSYS 公司提供的GTECH 库包含了高质量的常用的门级电路;&&(24)避免冗长的逻辑和子表达式;&&(25)避免采用内部三态电路,建议用多路选择电路代替内部三态电路。规则 #1: 建立时序逻辑模型时,采用非阻塞赋值语句。规则 #2: 建立latch模型时,采用非阻塞赋值语句。规则 #3: 在always块中建立组合逻辑模型时,采用阻塞赋值语句。规则 #4: 在一个always块中同时有组合和时序逻辑时时,采用非阻塞赋值语句。规则 #5: 不要在一个always块中同时采用阻塞和非阻塞赋值语句。规则 #6: 同一个变量不要在多个always块中赋值。规则 #7: 调用$strobe系统函数显示用非阻塞赋值语句赋的值。规则 #8: 不要使用#0延时赋值。组合逻辑1,敏感变量的描述完备性Verilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。Example1:input a,b,c;reg e,d;always @(a or b or c)& & begin& & e=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/& & d=e |c;& & endExample2:input a,b,c;reg e,d;always @(a or b or c or d)& & begin& & e=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/& & d=e |c;& & end2,条件的描述完备性如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。Example1:if (a==1'b1) q=1'b1;//如果a==1'b0,q=? q将保持原值不变,生成锁存器!Example2:if (a==1'b1) q=1'b1;else& && && &q=1'b0;//q有明确的值。不会生成锁存器!Example3:& &reg[1:0] a,q;& &....& &case (a)& && &2'b00 : q=2'b00;& && &2'b01 : q=2'b11;//如果a==2'b10或a==2'b11,q=? q将保持原值不变,锁存器!& &endcaseExample4:& &reg[1:0] a,q;& &....& &case (a)& && &2'b00 : q=2'b00;& && &2'b01 : q=2'b11;& && &default: q=2'b00;//q有明确的值。不会生成锁存器!& &endcase& &&&Verilog中端口的描述1,端口的位宽最好定义在I/O说明中,不要放在数据类型定义中;Example1:module test(addr,read,write,datain,dataout)input[7:0]&&input[15:0]input& && & read,output[7:0]&&//要这样定义端口的位宽!wire addr,read,write,reg&&Example2:module test(addr,read,write,datain,dataout)input&&datain,addr,read,wire[15:0]wire[7:0]&&wire& && & read,reg[7:0]& && &//不要这样定义端口的位宽!!2,端口的I/O与数据类型的关系:& & 端口的I/O& && && &&&端口的数据类型& && && && && && && &&&module内部& &&&module外部& && &input& && && && &&&wire& && && & wire或reg& && &output& && && &wire或reg& && && &&&wire& && &inout& && && && &wire& && && && &&&wire3,assign语句的左端变量必须是wire;直接用"="给变量赋值时左端变量必须是reg!Example:assign a=b; //a必须被定义为wire!!********begin& &a=b; //a必须被定义为reg!end&&VHDL中STD_LOGIC_VECTOR和INTEGER的区别例如A是INTEGER型,范围从0到255;B是STD_LOGIC_VECTOR,定义为8位。A累加到255时,再加1就一直保持255不变,不会自动反转到0,除非令其为0;而B累加到255时,再加1就会自动反转到0。所以在使用时要特别注意!以触发器为例说明描述的规范性1,无置位/清零的时序逻辑& & always @( posedge CLK)& && & begin& && & Q&=D;& && & end2,有异步置位/清零的时序逻辑&&异步置位/清零是与时钟无关的,当异步置位/清零信号到来时,触发器的输出立即&&被置为1或0,不需要等到时钟沿到来才置位/清零。所以,必须要把置位/清零信号&&列入always块的事件控制表达式。& & always @( posedge CLK or negedge RESET)& && & begin& && & if (!RESET)& && && & Q=0;& && & else& && && & Q&=D;& && & end3,有同步置位/清零的时序逻辑& &同步置位/清零是指只有在时钟的有效跳变时刻置位/清零,才能使触发器的输出分& &别转换为1或0。所以,不要把置位/清零信号列入always块的事件控制表达式。但是& &必须在always块中首先检查置位/清零信号的电平。& & always @( posedge CLK )& & begin& && & if (!RESET)& && && & Q=0;& && & else& && && & Q&=D;& && & end结构规范性在整个芯片设计项目中,行为设计和结构设计的编码是最重要的一个步骤。 它对逻辑综合和布线结果、时序测定、校验能力、测试能力甚至产品支持 都有重要的影响。考虑到仿真器和真实的逻辑电路之间的差异,为了有效的进行仿真测试:&&1,避免使用内部生成的时钟& & 内部生成的时钟称为门生时钟(gated clock)。如果外部输入时钟和门生时钟同时驱动,& & 则不可避免的两者的步调不一致,造成逻辑混乱。而且,门生时钟将会增加测试的难度& & 和时间。&&2,绝对避免使用内部生成的异步置位/清零信号& & 内部生成的置位/清零信号会引起测试问题。使某些输出信号被置位或清零,无法正常& & 测试。3,避免使用锁存器& & 锁存器可能引起测试问题。对于测试向量自动生成(ATPG),& & 为了使扫描进行,锁存器需要置为透明模式(transparent mode),& & 反过来,测试锁存器需要构造特定的向量,这可非同一般。&&4,时序过程要有明确的复位值& & 使触发器带有复位端,在制造测试、ATPG以及模拟初始化时,可以对整个电路进行& & 快速复位。&&5,避免模块内的三态/双向& & 内部三态信号在制造测试和逻辑综合过程中难于处理.近日读 J.Bhasker 的&verilog synthesis practical primer& , 受益匪浅,理清了不少基础电路知识 , 记下一些 tips :1. 过程赋值(always 中触发赋值)的变量,可能会被综合成连线 或触发器 或锁存器.2.综合成锁存器的规则:a. 变量在条件语句(if 或case)中,被赋值.b. 变量未在条件语句的所有分支中被赋值.c. 在always语句多次调用之间需要保持变量值 .以上三个条件必须同时满足.3.综合成触发器的规则:变量在时钟沿的控制下被赋值。例外情况:变量的赋值和引用都仅出现在一条always语句中,则该变量被视为中间变量而不是触发器。4. 对于无时钟事情的always语句(即组合逻辑建模),其时间表应包括该alwa语句引用的所有变量,否则会出现RTL与Netlist的不一致芯片外部引脚很多都使用inout类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和输出。 inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。 当inout端口不输出时,将三态门置高阻。这样信号就不会因为两端同时输出而出错了,更详细的内容可以搜索一下三态门tri-state的资料.1 使用inout类型数据,可以用如下写法:inout data_input data_reg data_//data_inout的映象寄存器reg link_assign data_inout=link_data?data_reg:1&//link_data控制三态门//对于data_reg,可以通过组合逻辑或者时序逻辑根据data_in对其赋值.通过控制link_data的高低电平,从而设置data_inout是输出数据还是处于高阻态,如果处于高阻态,则此时当作输入端口使用.link_data可以通过相关电路来控制.2 编写测试模块时,对于inout类型的端口,需要定义成wire类型变量,而其它输入端口都定义成reg类型,这两者是有区别的.当上面例子中的data_inout用作输入时,需要赋值给data_inout,其余情况可以断开.此时可以用assign语句实现:assign data_inout=link?data_in_t:1&其中的link ,data_in_t是reg类型变量,在测试模块中赋值.另外,可以设置一个输出端口观察data_inout用作输出的情况:Wire data_Assign data_out_t=(!link)?data_inout:1&else,in RTLinout use in top module(PAD)dont use inout(tri) in sub module也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在综合时往往会出错。对双向口,我们可以将其理解为2个分量:一个输入分量,一个输出分量。另外还需要一个控制信号控制输出分量何时输出。此时,我们就可以很容易地对双向端口建模。例子:CODE:module dual_port (....inout_pin,....);inout inout_wire inout_wire input_of_wire output_of_wire out_assign input_of_inout = inout_assign inout_pin = out_en ? output_of_inout : 高阻;endmodule可见,此时input_of_inout和output_of_inout就可以当作普通信号使用了。在仿真的时候,需要注意双向口的处理。如果是直接与另外一个模块的双向口连接,那么只要保证一个模块在输出的时候,另外一个模块没有输出(处于高阻态)就可以了。如果是在ModelSim中作为单独的模块仿真,那么在模块输出的时候,不能使用force命令将其设为高阻态,而是使用release命令将总线释放掉很多初学者在写testbench进行仿真和验证的时候,被inout双向口难住了。仿真器老是提示错误不能进行。下面是我个人对inout端口写testbench仿真的一些总结,并举例进行说明。在这里先要说明一下inout口在testbench中要定义为wire型变量。先假设有一源代码为:module xx(data_inout , ........);inout data_........................assign data_inout=(! link)?datareg:1'endmodule方法一:使用相反控制信号inout口,等于两个模块之间用inout双向口互连。这种方法要注意assign 语句只能放在initial和always块内。module test();wire data_reg data_initial begin..........endassign data_inout=link?data_reg:1'endmodule方法二:使用force和release语句,但这种方法不能准确反映双向端口的信号变化,但这种方法可以反在块内。module test();wire data_reg data_#& && &&&//延时force data_inout=1'& && && &&&//强制作为输入端口...............#release data_& && && & //释放输入端口endmodule很多读者反映仿真双向端口的时候遇到困难,这里介绍一下双向端口的仿真方法。一个典型的双向端口如图1所示。其中inner_port与芯片内部其他逻辑相连,outer_port为芯片外部管脚,out_en用于控制双向端口的方向,out_en为1时,端口为输出方向,out_en为0时,端口为输入方向。用Verilog语言描述如下:module bidirection_io(inner_port,out_en,outer_port);input out_inout[7:0] inner_inout[7:0] outer_assign outer_port=(out_en==1)?inner_port:8'assign inner_port=(out_en==0)?outer_port:8'endmodule用VHDL语言描述双向端口如下:use IEEE.STD_LOGIC_1164.ALL;entity bidirection_io isport ( inner_port : inout std_logic_vector(7 downto 0);out_en : in std_outer_port : inout std_logic_vector(7 downto 0) );end bidirection_architecture behavioral of bidirection_io isbeginouter_port&=inner_port when out_en='1' else (OTHERS=&'Z');inner_port&=outer_port when out_en='0' else (OTHERS=&'Z');仿真时需要验证双向端口能正确输出数据,以及正确读入数据,因此需要驱动out_en端口,当out_en端口为1时,testbench驱动inner_port端口,然后检查outer_port端口输出的数据是否正确;当out_en端口为0时,testbench驱动outer_port端口,然后检查inner_port端口读入的数据是否正确。由于inner_port和outer_port端口都是双向端口(在VHDL和Verilog语言中都用inout定义),因此驱动方法与单向端口有所不同。验证该双向端口的testbench结构如图2所示。这是一个self-checking testbench,可以自动检查仿真结果是否正确,并在Modelsim控制台上打印出提示信息。图中Monitor完成信号采样、结果自动比较的功能。testbench的工作过程为1)out_en=1时,双向端口处于输出状态,testbench给inner_port_tb_reg信号赋值,然后读取outer_port_tb_wire的值,如果两者一致,双向端口工作正常。2)out_en=0时,双向端口处于输如状态,testbench给outer_port_tb_reg信号赋值,然后读取inner_port_tb_wire的值,如果两者一致,双向端口工作正常。用Verilog代码编写的testbench如下,其中使用了自动结果比较,随机化激励产生等技术。`timescale 1ns/10psmodule tb();reg[7:0] inner_port_tb_wire[7:0] inner_port_tb_reg[7:0] outer_port_tb_wire[7:0] outer_port_tb_reg out_en_initialbeginout_en_tb=0;inner_port_tb_reg=0;outer_port_tb_reg=0;i=0;repeat(20)begin#50i=$out_en_tb=i[0]; //randomize out_en_tbinner_port_tb_reg=$ //randomize dataouter_port_tb_reg=$endend//**** drive the ports connecting to bidirction_ioassign inner_port_tb_wire=(out_en_tb==1)?inner_port_tb_reg:8'assign outer_port_tb_wire=(out_en_tb==0)?outer_port_tb_reg:8'//instatiate the bidirction_io modulebidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),.out_en(out_en_tb),.outer_port(outer_port_tb_wire));//***** monitor ******always@(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)begin#1;if(outer_port_tb_wire===inner_port_tb_wire)begin$display("\n **** time=%t ****",$time);$display("OK! out_en=%d",out_en_tb);$display("OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d",outer_port_tb_wire,inner_port_tb_wire);endelsebegin$display("\n **** time=%t ****",$time);$display("ERROR! out_en=%d",out_en_tb);$display("ERROR! outer_port_tb_wire != inner_port_tb_wire" );$display("ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d",outer_port_tb_wire,inner_port_tb_wire);endendendmodule今天重新回顾了一下阻塞赋值和非阻塞赋值的概念,感觉又有所收获。&一、特点:& & 阻塞赋值:1、RHS的表达式计算和LHS的赋值更新,这两个动作之间不能插入其他动作,即所谓计算完毕,立即更新。& && && && & 2、所谓阻塞就是指在一个&begin...end&块中的多个阻塞赋值语句内,只有上一句完全执行完毕后,才会执行下一语句,否则阻塞程序的执行。& & 非阻塞赋值:RHS的表达式计算和LHS的赋值更新分两个节拍执行,首先,应该是RHS的表达式计算,得到新值后并不立即赋值,而是放在事件队列中等待,直到& && && && &&&当前仿真时刻的后期才执行(原因下文会提到)。二、Verilog的分层事件队列:& & 在Verilog中,事件队列可以划分为5个不同的区域,不同的事件根据规定放在不同的区域内,按照优先级的高低决定执行的先后顺序,下表就列出了部分Verilog分层事件队列。其中,活跃事件的优先级最高(最先执行),而监控事件的优先级最低,而且在活跃事件中的各事件的执行顺序是随机的(注:为方便起见,在一般的仿真器中,对同一区域的不同事件是按照调度的先后关系执行的)。& &当前仿真时间事件活跃事件& & & &&&阻塞赋值,非阻塞赋值的RHS计算&&非活跃事件显式0延时的阻塞赋值&&非阻塞赋值更新事件由非阻塞语句产生的一个非阻塞赋值更新事件,并被调入当前仿真时刻。监控事件$monitor和$strobe等系统任务将来仿真时间事件& & & &&&& & & &&&被调度到将来仿真时间的事件三、结论:& & 由上表就可以知道,阻塞赋值属于活跃事件,会立刻执行,这就是阻塞赋值&计算完毕,立刻更新&的原因。此外,由于在分层事件队列中,只有将活跃事件中排在前面的事件调出,并执行完毕后,才能够执行下面的事件,这就可以解释阻塞赋值的第二个特点。& & 同样是由上表知,非阻塞赋值的RHS计算属于活跃事件,而非阻塞赋值更新事件排在非活跃事件之后,因此只有仿真队列中所有的活跃事件和非活跃事件都执行完毕后,才轮到非阻塞赋值更新事件,这就是非阻塞赋值必须分两拍完成的原因。以上就是我今天的读书笔记,写得仓促,如有不对,敬请指出 。一. 强调Verilog代码编写风格的必要性。强调Verilog代码编写规范,经常是一个不太受欢迎的话题,但却是非常有必要的。每个代码编写者都有自己的编写习惯,而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码,阅读起来容易接受和理解。相反和自己编写风格差别较大的代码,阅读和接受起来就困难一些。曾有编程大师总结说,一个优秀的程序员,能维护的代码长度大约在1万行数量级。代码的整洁程度,很大程度上影响着代码的维护难度。遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档。相反代码编写风格随意的代码,通常晦涩、凌乱,会给开发者本人的调试、修改工作带来困难,也会给合作者带来很大麻烦。(实际上英文Coding Style有另一层涵义,更偏重的是,某一个电路,用那一种形式的语言描述,才能将电路描述得更准确,综合以后产生的电路更合理。本文更偏重的是,编写Verilog代码时的书写习惯。)二. 强调编写规范的宗旨。缩小篇幅提高整洁度便于跟踪、分析、调试增强可读性,帮助阅读者理解便于整理文档便于交流合作三. 变量及信号命名规范。1. 系统级信号的命名。系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。2. 低电平有效的信号后一律加下划线和字母n。如:SysRst_n;FifoFull_n;3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。4. 模块的命名。在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如:Arithmatic Logical Unit模块,命名为ALU。Data Memory Interface模块,命名为DMI。Decoder模块,命名为DEC。5. 模块之间的接口信号的命名。所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。两部分之间用下划线隔离开。第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写,Req是Request的缩写。两个缩写的第一个字母都大写,便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。模块上下层次间信号的命名也遵循本规定。若某个信号从一个模块传递到多个模块,其命名应视信号的主要路径而定。6. 模块内部信号:模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;单词除常用的缩写方法外(如:Clock-&Clk, Write-&Wr, Read-&Rd等),一律取该单词的前几个字母( 如:Frequency-&Freq, Variable-&Var 等);每个缩写单词的第一个字母大写;若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);举例:SdramWrEn_n;FlashAddrLatchEn;四. 编码格式规范。1. 分节书写,各节之间加1到多行空格。如每个always,initial语句都是一节。每节基本上完成一个特定的功能,即用于描述某几个信号的产生。在每节之前有几行注释对该节代码加以描述,至少列出本节中描述的信号的含义。2. 行首不要使用空格来对齐,而是用Tab键,Tab键的宽度设为4个字符宽度。行尾不要有多余的空格。3. 注释。使用//进行的注释行以分号结束;使用/* */进行的注释,/*和*/各占用一行,并且顶头;例:// Edge detector used to synchronize the input signal;4. 空格的使用:不同变量,以及变量与符号、变量与括号之间都应当保留一个空格。Verilog关键字与其它任何字符串之间都应当保留一个空格。如:Always @ (&&)使用大括号和小括号时,前括号的后边和后括号的前边应当留有一个空格。逻辑运算符、算术运算符、比较运算符等运算符的两侧各留一个空格,与变量分隔开来;单操作数运算符例外,直接位于操作数前,不使用空格。使用//进行的注释,在//后应当有一个空格;注释行的末尾不要有多余的空格。例:assign SramAddrBus = { AddrBus[31:24], AddrBus[7:0] };assign DivCntr[3:0] = DivCntr[3:0] + 4&b0001;assign Result = ~O5. 同一个层次的所有语句左端对齐;Initial、always等语句块的begin关键词跟在本行的末尾,相应的end关键词与Initial、always对齐;这样做的好处是避免因begin独占一行而造成行数太多;例:always @ ( posedge SysClk or negedge SysRst ) beginif( !SysRst ) DataOut &= 4'b0000;else if( LdEn ) beginDataOut &= DataIn;Endelse DataOut &= DataOut + 4'b0001;end6. 不同层次之间的语句使用Tab键进行缩进,每加深一层缩进一个Tab;8. 在endmodule,endtask,endcase等标记一个代码块结束的关键词后面要加上一行注释说明这个代码块的名称;9. 在task名称前加tsk以示标记。在function的名称前加func以示标记。例如:task tskResetSystem;&&endtask //of tskResetSystem五.小结:以上列出的代码编写规范无法覆盖代码编写的方方面面,还有很多细节问题,需要在实际编写过程中加以考虑。并且有些规定也不是绝对的,需要灵活处理。并不是律条,但是在一个项目组内部、一个项目的进程中,应该有一套类似的代码编写规范来作为约束。总的方向是,努力写整洁、可读性好的代码二.reg型在&always&块内被赋值的每一个信号都必须定义成reg型。reg型数据的缺省初始值是不定值。reg型只表示被定义的信号将用在&always&块内,理解这一点很重要。并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样。三.memory型memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:reg [n-1:0] 存储器名[m-1:0];或& & & & reg [n-1:0] 存储器名[m:1];在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器。存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器。reg [7:0] mema[255:0];这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。注意:对存储器进行地址索引的表达式必须是常数表达式。尽管memory型数据和reg型数据的定义格式很相似,但要注意其不同之处。如一个由n个1位寄存器构成的存储器组是不同于一个n位的寄存器的。见下例:reg [n-1:0]& & //一个n位的寄存器reg mema [n-1:0];& & //一个由n个1位寄存器构成的存储器组一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。见下例:rega =0;& & & & //合法赋值语句mema =0;& & & & //非法赋值语句如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的。mema[3]=0;& & & & //给memory中的第3个存储单元赋值为0。3.3.1.基本的算术运算符在Verilog HDL语言中,算术运算符又称为二进制运算符,共有下面几种:1)& && &+ (加法运算符,或正值运算符,如 rega+regb,+3)2)& && &-(减法运算符,或负值运算符,如 rega-3,-3)3)& && &&(乘法运算符,如rega*3)4)& && &/ (除法运算符,如5/3)5)& && &% (模运算符,或称为求余运算符,要求%两侧均为整型数据。如7%3的值为1)注意:& & & & 在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。1)& && &~& && && & //取反2)& && &&& && && & //按位与3)& && &|& && && & //按位或4)& && &^& && && & //按位异或5)& && &^~& && && &//按位同或(异或非)在Verilog HDL语言中存在三种逻辑运算符:1)& && &&& 逻辑与2)& && &|| 逻辑或3)& && &! 逻辑非关系运算符共有以下四种:a & b& && & a小于ba & b& && & a大于ba &= b& && &a小于或等于ba &= b& && &a大于或等于b3.3.5.等式运算符3.3.6.移位运算符3.3.7.位拼接运算符(Concatation)3.3.10.关键词在Verilog HDL中,所有的关键词是事先定义好的确认符,用来组织语言结构。关键词是用小写字母定义的,因此在编写原程序时要注意关键词的书写,以避免出错。下面是Verilog HDL中使用的关键词(请参阅附录:Verilog语言参考手册):always, and, assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign,default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive, endspecify, endtable, endtask, event, for, force, forever, fork, function,highz0, highz1, if,initial, inout, input,integer,join,large,macromodule,medium,module,nand,negedge,nmos,nor,not,notif0,notifl, or, output, parameter, pmos, posedge, primitive, pull0, pull1, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos, rtran, rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0, strong1, supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg,vectored,wait,wand,weak0,weak1,while, wire,wor, xnor, xor(1).非阻塞(Non_Blocking)赋值方式( 如 b &= )1)& && &块结束后才完成赋值操作。2)& && &b的值并不是立刻就改变的。3)& && &这是一种比较常用的赋值方法。(特别在编写可综合模块时)(2).阻塞(Blocking)赋值方式( 如 b = )1)& && &赋值语句执行完后,块才结束。2)& && &b的值在赋值语句执行完后立刻就改变的。3)& && &可能会产生意想不到的结果。一.顺序块顺序块有以下特点:1)& && &块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。2)& && &每条语句的延迟时间是相对于前一条语句的仿真时间而言的。3)& && &直到最后一条语句执行完,程序流程控制才跳出该语句块。顺序块的格式如下:begin语句1;语句2;......语句n;end其中:?& && &&&块名即该块的名字,一个标识名。其作用后面再详细介绍。?& && &&&块内声明语句可以是参数声明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句。二. 并行块并行块有以下四个特点:1)& && &块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。2)& && &块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。3)& && &延迟时间是用来给赋值语句提供执行时序的。4)& && &当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。并行块的格式如下:fork语句1;语句2;.......语句n;join其中:&& && &&&块名即标识该块的一个名字,相当于一个标识符。&& && &&&块内说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句、事件(event)说明语句。在fork_join块内,各条语句不必按顺序给出,因此在并行块里,各条语句在前还是在后是无关紧要的。见下例:三. 块名在VerilgHDL语言中,可以给每个块取一个名字,只需将名字加在关键词begin或fork后面即可。这样做的原因有以下几点。1)& && &这样可以在块内定义局部变量,即只在块内使用的变量。2)& && &这样可以允许块被其它语句调用,如被disable语句。3)& && &在Verilog语言里,所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址,因此进入或跳出块并不影响存储在变量内的值。基于以上原因,块名就提供了一个在任何仿真时刻确认变量值的方法。casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。3.6.循环语句在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。1)& & forever& & & & 连续的执行语句。2)& & repeat& & & & 连续执行一条语句 n 次。3)& & while& & & & 执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),& && && && & 则语句一次也不能被执行。4)& & for通过以下三个步骤来决定语句的循环执行。a)& && &先给控制循环次数的变量赋初值。b)& && &判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。c)&#1:当为时序逻辑建模,使用&非阻塞赋值&。#2:当为锁存器(latch)建模,使用&非阻塞赋值&。#3:当用always块为组合逻辑建模,使用&阻塞赋值&#4:当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用&非阻塞赋值&。#5:不要在同一个always块里面混合使用&阻塞赋值&和&非阻塞赋值&。#6:不要在两个或两个以上always块里面对同一个变量进行赋值。#7:使用$strobe以显示已被&非阻塞赋值&的值。#8:不要使用#0延迟的赋值。#9:在VERILOG语法中, if...else if ... else 语句是有优先级的,一般说来第一个IF的优先级最高,最后一个ELSE的优先级最低。如果描述一个编码器,在XILINX的XST综合参数就有一个关于优先级编码器硬件原语句的选项Priority Encoder Extraction. 而CASE语句是"平行"的结构,所有的CASE的条件和执行都没有&优先级&。而建立优先级结构会消耗大量的组合逻辑,所以如果能够使用CASE语句的地方,尽量使用CASE替换IF...ELSE结构。#10:XILINX的底层可编程硬件资源叫SLICE,由2个FF和2个LUT组成。 FF触发器&&LUT查找表ALTERA的底层可编程硬件资源叫LE,&&由1个FF和1个LUT组成。#11:慎用锁存器(latch),同步时序设计要尽量避免使用锁存器,综合出非目的性latch的主要原因在于不完全的条件判断句。另外一种情况是设计中有组合逻辑的反馈环路(combinatorial feedback loops)。#12:状态机的一般设计原则,Biary, gray-code 编码使用最少的触发器,较多的组合逻辑。而one-hot编码反之。所以CPLD多使用GRAY-CODE, 而FPGA多使用ONE-HOT编码。另一方面,小型设计使用GRAY-CODE和BINARY编码更有效,而大型状态机使用ONE-HOT更有效。#13:业界主流CPLD产品是lattice的LC4000系列和ALTERA的MAX3000系列。#14:复位使初始状态可预测,防止出现禁用状态。FPGA 和CPLD 的复位信号采用异步低电平有效信号,连接到其全局复位输入端,使用专用路径通道,复位信号必须连接到FPGA 和CPLD 的全局复位管脚。。#15:不要用时钟或复位信号作数据或使能信号,也不能用数据信号作为时钟或复位信号,否则HDL 综合时会出现时序验证问题。信号穿过时钟的两半个周期时,要在前后分别取样;防止出现半稳定状态。#16:fpga设计中 不要使用门时钟(don't use gated clock)。时钟信号必须连接到全局时钟管脚上。#17:不要使用内部三态信号,否则增加功耗。#18:只使用同步设计,不要使用延时单元。#19:避免使用负延触发的双稳态多谐振荡器(flip flop)。#20:不要使用信号和变量的默认值(或初始值),用复位脉冲初始化信号和变量。#21:不要在代码中使用buffer 类型的端口读取输出数据;要使用out 类型,再增加另外变量或信号,以获取输出值。这是因为buffer 类型的端口不能连接到其他类型的端口上,因此buffer 类型就会在整个设计的端口中传播下去。#22:对变量要先读后写;如果先写后读,就会产生长的组合逻辑和锁存器(或寄存器)。这是因为变量值是立即获取的。#23:在组合逻辑进程中,其敏感向量标中要包含所有要读取得信号;这是为了防止出现不必要的锁存器。近期,在stephen Brown的一本书数字逻辑基础与verilog设计一书中看到关于触发器电路的时序分析。以前一直没有搞明白这个问题,现在觉得豁然开朗。怕忘记了,特地摘抄与此与edacn网友分享。触发器电路的时序分析:图7-84给出了一个使用D触发器的简单电路。我们想要计算该电路能正常工作的最大的时钟频率Fmax,并且想确定该电路的保持时间是否不够长。在技术文献中,这种类型的电路分析通常叫做时序分析。假设该触发器的时序参数为:tsu=0.6ns,th=0.4ns,0.8ns&=tcQ&=1.0ns。给tcq参数规定一个范围是因为延迟参数分布在一定范围内,这样处理是现成集成电路芯片常用的方法。为了计算最小的时钟信号周期Tmin=1/Fmax,我们必须考虑在触发器中从开始到结束的所有路径。在这个简单的电路中,只有一条这样的路径,这条路径开始于数据被时钟信号的正跳变沿加载进入触发器,经过tcQ的延迟后传播到Q的输出端,再传播通过非门,同时必须满足D输入端的建立时间要求。因此:Tmin=tcQ+tNOT+tsu由于我们关注的只是计算出最长的延迟时间,所以应该用tcQ的最大值。为了计算出tNOT,我们将假设通过任何逻辑门的延迟都可以用1+0.1k进行计算,其中k是该门的输入信号的个数。对非门而言,k=1,因此得到如下Tmin和Fmax的值:Tmin=1.0+1.1+0.6=2.7nsFmax=1/2.7ns=370.37MHz当然,有必要检查电路中的保持时间是否违反规定。在这种场合,我们必须核查从时钟信号的正跳变沿到D输入值改变的最短延迟。该延迟由tcQ+tNOT=0.8+1.1=1.9ns给定。因为1.9ns&0.4ns,所以保持时间够长,没有违反规定。再举一个触发器电路时序分析的例子,请考虑图7-85所示的计数器电路。假设所用的触发器的时序参数与图7-84中用过的触发器相同,请计算该电路能正常运行的最高频率。再次假设通过逻辑门的传播延迟可以用1+0.1k来计算。在这个电路中,存在着四个触发器从开始到结束的许多路径。最长的路径从触发器Q0起到触发器Q3结束。在某个电路中最长的路径成为关键路径。关键路径的延迟包括触发器Q0的时钟信号到Q的延迟、通过三个与门的传播延迟和一个异或门的延迟。我们还必须考虑触发器Q3的建立时间。因此,得到Tmin=tcQ+3(tAND)+tXOR+tsu用tcQ的最大值,得到Tmin=1.0+3(1.2)+1.2+0.6=6.4nsFmax=1/6.4ns=156.25MHz该电路的最短路径是从每个触发器通过异或门反馈到该触发器本身的输入端。沿每个这样路径的最小延迟为tcQ+tXOR=0.8+1.2=2.0ns。因为2.0ns&th=0.4ns,因此保持时间足够长,没有违反规定。& && & 在上面的分析中,假设时钟信号同时到达所有四个触发器。我们现在将重复这个分析,假设时钟信号同时到达触发器Q0,Q1,Q2,但到达触发器Q3有一些延迟。始终到达不同的触发器之间的时间差称为时钟偏差(clock skew),记作tskew,时钟偏差可以由许多原因引起。& && & 在图7-85中,电路的关键路径是从触发器Q0起到触发器Q3。然而,Q3的时钟偏差使得这个延迟减少,因为时钟偏差在数据被加载进该触发器前提供了附加的时间。如果考虑增加1.5ns的时钟偏差,则从触发器Q0到触发器Q3的路径延迟由tcQ+3(tAND)+tXOR+tsu-tskew=6.4-1.5ns=4.9ns给定。该电路现在还存在一个不同的关键路径,该路径从触发器Q0起到触发器Q2结束。这条路径的延迟为Tmin=tcQ+2(tAND)+tXOR+tsu=1.0+2(1.2)+1.2+0.6ns=5.2nsFmax=1/5.2ns=192.31MHz& && & 在这种场合,时钟偏差导致电路的最高时钟频率提高。但是,如果时钟偏差是负的,即触发器Q3的时钟到达时间比其他触发器更早一些,则会造成该电路的最高时钟频率Fmax降低。& && & 因为数据加载到触发器Q3被时钟偏差延迟了,所以对所有起始于Q0,Q1,Q2而以Q3为结束点的路径,都会产生使触发器Q3的保持时间需要增加到th+tskew的影响。在该电路中,这种最短的路径是从触发器Q2到Q3的路径,其延迟时间为TcQ+tAND+tXOR=0.8+1.2+1.2=3.2ns。因为3.2ns&th+tskew=1.9ns,所以保持时间足够长,没有违反规定。如果对时钟偏差值tskew&=3.2-th=2.8ns,重复以上保持时间的分析,则会出现保持时间不够的情况。当tskew&=2.8ns时,该电路将不可能在任何频率下可靠地运行。由于时钟偏差的存在会引起电路时序问题,所以好的电路设计方法必须保证时钟信号到达所有触发器的偏差尽可能小。最后是我的总结:确定最小周期是找关键路径即最长路径。确定Th是否违例是找最短路径。最短路径要大于Th。如果有Tskew的情况则要大于Th+Tskew(有skew的寄存器为最短路径的终点的时候)还有就是我对有Tskew的情况的时候为什么防止违例要最短路径&Th+Tskew。因为Q0,Q1和Q2时钟比Q3早,以他们为起点的路径已经开始走了一段时间后Q3的时钟才到才开始打入数据。所以保持时间上要加上这段skewISE 约束文件的基本操作1.约束文件的概念FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束、管脚约束以及区域约束。3类约束文件的关系为:用户在设计输入阶段编写UCF文件,然后UCF文件和设计综合后生成NCF文件,最后再经过实现后生成PCF 文件。本节主要介绍UCF文件的使用方法。UCF文件是ASC 2码文件,描述了逻辑设计的约束,可以用文本编辑器和Xilinx约束文件编辑器进行编辑。NCF约束文件的语法和UCF文件相同,二者的区别在于: UCF文件由用户输入,NCF文件由综合工具自动生成,当二者发生冲突时,以UCF文件为准,这是因为UCF的优先级最高。PCF文件可以分为两个部分:一部分是映射产生的物理约束,另一部分是用户输入的约束,同样用户约束输入的优先级最高。一般情况下,用户约束都应在UCF文件中完成,不建议直接修改 NCF文件和PCF文件。2.创建约束文件约束文件的后缀是.ucf,所以一般也被称为UCF文件。创建约束文件有两种方法,一种是通过新建方式,另一种则是利用过程管理器来完成。第一种方法:新建一个源文件,在代码类型中选取&Implementation Constrains File&,在&File Name&中输入&one2two_ucf&。单击&Next&按键进入模块选择对话框,选择模块&one2two&,然后单击&Next&进入下一页,再单击&Finish&按键完成约束文件的创建。第二种方法:在工程管理区中,将&Source for&设置为&Synthesis/Implementation&。&Constrains Editor&是一个专用的约束文件编辑器,双击过程管理区中&User Constrains&下的&Create Timing Constrains&就可以打开&Constrains Editor&,其界面如图所示:图 启动Constrains Editor引脚约束编辑在&Ports&选项卡中可以看到,所有的端口都已经罗列出来了,如果要修改端口和FPGA管脚的对应关系,只需要在每个端口的&Location&列中填入管脚的编号即可。例如在UCF文件中描述管脚分配的语法为:& && &&&NET &端口名称& LOC = 引脚编号;需要注意的是,UCF文件是大小敏感的,端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样。但是关键字NET是不区分大小写的。3.编辑约束文件在工程管理区中,将&Source for&设置为&Synthesis/Implementation&,然后双击过程管理区中&User Constrains&下的&Edit Constraints (Text)&就可以打开约束文件编辑器,如下图所示,就会新建当前工程的约束文件。&&图 用户约束管理窗口UCF文件的语法说明1.语法&& && &&&UCF文件的语法为:{NET|INST|PIN} "signal_name" A其中,&signal_name&是指所约束对象的名字,包含了对象所在层次的描述;&Attribute&为约束的具体描述;语句必须以分号&;&结束。可以用&#&或&/* */&添加注释。需要注意的是:UCF文件是大小写敏感的,信号名必须和设计中保持大小写一致,但约束的关键字可以是大写、小写甚至大小写混合。例如:NET "CLK" LOC = P30;&CLK&就是所约束信号名,LOC = P30;是约束具体的含义,将CLK信号分配到FPGA的P30管脚上。对于所有的约束文件,使用与约束关键字或设计环境保留字相同的信号名会产生错误信息,除非将其用" "括起来,因此在输入约束文件时,最好用" "将所有的信号名括起来。2.通配符在UCF文件中,通配符指的是&*&和&?&。&*&可以代表任何字符串以及空,&?&则代表一个字符。在编辑约束文件时,使用通配符可以快速选择一组信号,当然这些信号都要包含部分共有的字符串。例如:NET "*CLK?" FAST;将包含&CLK&字符并以一个字符结尾的所有信号,并提高了其速率。在位置约束中,可以在行号和列号中使用通配符。例如:INST "/CLK_logic/*" LOC = CLB_r*c7;把CLK_logic层次中所有的实例放在第7列的CLB中。3.定义设计层次& && & 在UCF文件中,通过通配符*可以指定信号的设计层次。其语法规则为:* 遍历所有层次Level1/* 遍历level1及以下层次中的模块Level1/*/ 遍历level1种的模块,但不遍历更低层的模块例4-5 根据图4-75所示的结构,使用通配符遍历表4-3所要求的各个模块。图 层次模块示意图表 要求遍历的符号列表管脚和区域约束语法LOC约束是FPGA设计中最基本的布局约束和综合约束,能够定义基本设计单元在FPGA芯片中的位置,可实现绝对定位、范围定位以及区域定位。此外, LOC还能将一组基本单元约束在特定区域之中。LOC语句既可以书写在约束文件中,也可以直接添加到设计文件中。换句话说,ISE中}

我要回帖

更多关于 石家庄洞天影院宿舍 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信