tag 标签: 综合

相关博文
  • 热度 20
    2016-2-27 15:47
    1291 次阅读|
    0 个评论
    2 、综合优化 2.1 )撰写代码时要注意哪些问题 上面提到综合其实就是将代码映射到第三方的工艺库中,并且进行优化达到面积、功耗最小,性能最好的过程。那么该如何进行综合优化,我们在撰写代码的过程中要注意哪些问题呢。 2.1.1 )良好的模块划分, partition 好的开始意味着成功了一半,芯片从开始设计的时候就要特别注意模块划分,一般划分按照功能来划分,不宜过多,也不宜不少,每个模块的代码控制在 1000 行左右,太多的话也不利于阅读和维护;模块划分有利于后端的综合,日后 ip 的重用,代码的维护,灵活性比较强,切记将所有的功能揉到一个模块中,也切记将一个功能分割成许多的子模块。 例如上图就是一个比较糟糕的模块划分, B 模块变成了纯组合逻辑,这样很不利于后续的综合(当然可以利用展平模块来综合解决这种问题,但是尽量不要这样;有些模块其实并不能跨模块进行综合)。 改成上图这种划分就比较好,将组合逻辑包在一块进行处理,这样比较利于后续的综合工作。 但是上面的几种划分其实都有一定的问题,就是如果 ABC 组合逻辑太大的话还是不利于后续的综合,最好的就是将每块的组合逻辑都经过时序逻辑的处理。当然,如果组合逻辑不是很大的话,也可以不必做下面的处理。 2.1.2 )避免胶连逻辑, glue logic 胶连逻辑在模块例化的时候最容易被产生而且忽略,这种逻辑在综合的时候不属于任何一个模块,所以很尴尬,不能被很好的综合。如下图的与非门,不属于 ABC 任何一个模块。 最好的办法是如下图,将胶连逻辑吸进到 C 模块里。这样 Top 层除了模块例化的连线之外再也没有其他逻辑了。 2.1.3 )模块大小适宜, block size 模块太大或者太小的时候你就需要考虑是否需要重新进行模块划分,否则影响综合处的结果,也影响综合所花费的时间和成本。 2.1.3 )模块分割适宜, block separate Pad,clk,power,jtag,core logic 等分开划分,不要搅在一块。 2.1.4 )总结:
  • 热度 23
    2016-2-14 21:40
    1300 次阅读|
    0 个评论
    1 、综合流程 如下图所示,是一款芯片开发的所有过程,其中综合只是其中的一个环节。 Chip specification: 基于市场部或者用户的需求,系统软硬件开发部门,确定要做的东西,讨论其可行性,未来所能带来的一些收益,然后定下规格书。 Partition chip floorplan :软硬件部分进行系统级的工作划分,其中硬件部门再进行具体的芯片方案的规划,模块的划分;是否是 soc 方案,如果是的话, cpu 等如何选型,大概的面积,功耗等等。然后开发人员利用 rtl 代码实现 idea, 之后会进入 lint,cdc,simulation 等一系列确定功能正确的流程。 RTL synthesis integrate block :将 rtl 实现的代码及 soc 中其他 ip 结合约束等进行综合,翻译成对应的网表。这时会做 ccd 等。 下面主要将综合及优化部分,后续的部分将在第六章进行讲解。
  • 热度 12
    2014-12-29 08:56
    1394 次阅读|
    0 个评论
      在综合实现这一部分,ISE主要有5个步骤 synthesize,translate,map,placeroute,generate programming File synthesize: 工具可以用自带的XST(全称为xilinx sythesize technology),Synthesis完毕后,可以用任何的文本工具打开后缀名为“.syr”的文件,察看synthesis的具体运行过程及报告。 命令可如下: xst -ise "G:/communication/adhoc/code/vitgenerate/testrst/testproj.ise" -intstyle ise -ifn testrst.xst -ofn testrst.syr 在这一过程中产生的比较重要的文件有 .ngr 逻辑设计的网表 .ngc 包含了逻辑设计及约束的网表 translate: 把所有的netlist以及user constrain合并成一个.ngd文件,以代map使用。这个过程用到的工具是ngdbuild. 产生后缀名为.bld的文件 ngdbuild -ise "G:/communication/adhoc/code/vitgenerate/testrst/testproj.ise" -intstyle ise -dd _ngo -nt timestamp -uc "testrst.ucf" -p xc4vfx60-ff672-11 "testrst.ngc" testrst.ngd map 将ngd文件映射到具体的FPGA中,MAP将产生一个NCD文件以及pcf文件。.ncd native circuit discription,用CLB,IOB描述的用于布局布线的文件 map -ise "G:/communication/adhoc/code/vitgenerate/testrst/testproj.ise" -intstyle ise -p xc4vfx60-ff672-11 -cm area -pr b -k 4 -c 100 -o testrst_map.ncd testrst.ngd testrst.pcf placeroute 布局布线,产生的是NCD文件,同时产生.par报告文件。 par -ise "G:/communication/adhoc/code/vitgenerate/testrst/testproj.ise" -w -intstyle ise -ol std -t 1 testrst_map.ncd testrst.ncd testrst.pcf generate programming File 使用bitgen工具,产生.bit文件 bitgen -ise "G:/communication/adhoc/code/vitgenerate/testrst/testproj.ise" -intstyle ise -f testrst.ut testrst.ncd
  • 热度 20
    2013-9-6 18:13
    2129 次阅读|
    0 个评论
    原文地址 http://bbs.ednchina.com/BLOG_ARTICLE_1770084.HTM   (1) 所有综合工具都支持的结构: always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。     (2) 所有综合工具都不支持的结构 :time,defparam,$finish,fork,join,initial,delays,UDP,wait。     (3) 有些工具支持有些工具不支持的结构 :casx,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。   建立 可综合 模型的原则     要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:     (1)不使用initial。     (2)不使用#10。     (3)不使用循环次数不确定的循环语句,如forever、while等。     (4)不使用用户自定义原语(UDP元件)。     (5)尽量使用同步方式设计电路。     (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。     (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。     (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。     (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。     (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。     (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。     (12)避免混合使用上升沿和下降沿触发的触发器。     (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。     (14)避免在case语句的分支项中使用x值或z值。   不可综合verilog语句 2009-04-14 19:33 1、initial                        只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么) 2、events                       event在同步test bench时更有用,不能综合。 3、real                            不支持real数据类型的综合。 4、time                                不支持time数据类型的综合。 5、force 和release           不支持force和release的综合。 6、assign 和deassign           不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 7、fork join                     不可综合,可以使用非块语句达到同样的效果。 8、primitives                     支持门级原语的综合,不支持非门级原语的综合。 9、table                         不支持UDP 和table的综合。 10、敏感列表里同时带有posedge和negedge      如:always @(posedge clk or negedge clk) begin...end     这个always块不可综合。 11、同一个reg变量被多个always块驱动 12、延时     以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。      如:a=#10 b;     这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b; 13、与X、Z的比较      可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。     如: 1 module synthesis_compare_xz (a,b); 2 output a; 3 input b; 4 reg a; 5    6 always @ (b) 7 begin 8   if ((b == 1'bz) || (b == 1'bx)) begin 9     a = 1; 10   end else begin 11     a = 0; 12   end 13 end  14    15 endmodule
  • 热度 19
    2013-8-7 17:12
    1570 次阅读|
    0 个评论
    RTL编码风格所造成的仿真和综合的不匹配 1.0 简介 ASIC或者FPGA设计就是把一个想法或者概念转换成物理实现的过程。这篇文章讨论了HDL编码风格所造成的RTLGate-level仿真的不一致的几种情况。 它的一个基本的判定规则是,符合以下两种情况的编码风格是坏的编码风格。 ·         提供给HDL仿真器的关于设计的信息不能传送给综合工具 ·         综合开关提供给综合工具的信息在仿真器中不可得 如果上犯了上两条禁忌,就会造成综合前的RTL仿真和综合后的门级仿真不匹配的问题。这些问题很难发现,因为由于门的数量的增多,完备测试是不可能的,而且如果不注意会最终导致ASIC生产的失败。 解决方法就是了解什么样的编码风格或者综合选项会导致RTL到门级的仿真不一致,并避免这些问题。 2.0 敏感列表 当一个always块中并不包含Verilog的关键字posedge或者negedge的时候综合工具会把它综合成组合或者锁存器逻辑。对于一个组合逻辑always块,逻辑直接从块中的等式中推导出,*而与敏感列表没有关系*。综合工具读取敏感列表,并把它与always块中的等式相比较,报告出可能造成pre-和post-synthesis仿真不一致的疏漏的敏感列表。 若一个信号在敏感列表中出现而没有在always块用到,它不会对pre-和post-synthesis造成任何功能上的不同。多余的敏感信号的唯一的后果就是使仿真变慢了。 2.1 不完全敏感信号列表 综合工具总是把always块中的等式按完整敏感信号来综合。但是pre-synthesis的功能仿真就会非常不同。 ·  module code1a (o, a, b); ·     output o; ·     input  a, b; ·     reg    o; ·     always @(a or b) ·       o = a b; ·  endmodule 在code1a中敏感列表时完整的,pre-synthesis和post-synthesis都会按一个2输入and门来仿真 · module code1b (o, a, b); ·    output o; ·    input  a, b; ·    reg    o; ·    always @(a) ·      o = a b; · endmodule 在code1b中敏感列表不完整,post-synthesis仍然是个2-input and门,而在pre-synthesis的仿真中只有在a有变化的时候always块才会执行。 · module code1c (o, a, b); ·    output o; ·    input  a, b; ·    reg    o; ·    always ·      o = a b; · endmodule code1c不包括任何敏感列表,在pre-synthesis的时候仿真器在在always块中陷入无限循环,而post-synthesis仍然是个2-input and门   2.2 不同赋值顺序的完整敏感列表 -在pre-synthesis时always块中的赋值语句会按顺序执行。这样,在always块中有局部临时变量时就会产生问题,临时变量可能在if语句的判断条件部分,case语句,或者赋值语句的右端中用到。*如果一个临时变量在被赋值之前用到,就会导致赋值的乱序*。直到temp变量的赋值语句被执行,temp将保持之前传送给它的值。 ·     module code2a (o, a, b, c, d); ·        output o; ·        input  a, b, c, d; ·        reg    o, temp; ·        always @(a or b or c or d) begin ·          o    = a b | temp; ·          temp = c d; ·        end ·      endmodule -在code2a中,temp在被赋值之前被用到,temp将保持之前的值。之后temp被赋新值。在pre-synthesis仿真中,temp将像一个锁存器。而在综合时,它会按正确的顺序赋值。此会造成不一致。 ·     module code2b (o, a, b, c, d); ·        output o; ·       input  a, b, c, d; ·        reg    o, temp; ·        always @(a or b or c or d) begin       temp = c d;       o    = a b | temp; ·        end ·      endmodule   -code2b中pre-和post-synthesis仿真结果是一致的。 3.0 function -function总是被综合成组合电路,由于这个原因,一些工程师把所有的组合逻辑都用function来实现。如果function按照组合逻辑来仿真使用function是没有什么问题的。当工程师在function中的组合逻辑中犯了错误而使它仿真时像一个锁存器,就会产生错误。当function代码仿真寄存器的行为的时候综合工具是没有警告信息的。用function建模组合逻辑是危险的。 ·   module code3a (o, a, nrst, en); ·      output o; ·      input  a, nrst, en; ·      reg    o; ·      always @(a or nrst or en) ·        if      (!nrst) o = 1'b0; ·        else if (en)    o = a; ·    endmodule   -code3a是设计锁存器的典型方法。 ·   module code3b (o, a, nrst, en); ·      output o; ·      input  a, nrst, en; ·      reg    o; ·      always @(a or nrst or en) ·        o = latch(a, nrst, en); ·      function latch; ·        input a, nrst, en; ·        if      (!nrst) latch = 1'b0; ·        else if (en)    latch = a; ·      endfunction ·    endmodule   -code3b中把相同的代码用在了一个if语句中,产生了3-input and门。 -如果在function中的代码是用来生成latch的,pre-synthesis仿真将仿真成latch的行为,为post-synthesis仿真将会仿真成组合逻辑。从而造成不匹配。 4.0 case语句 4.1 Full Case *用编译指令//synopsys full_case 给编译工具更多的关于设计的信息,而不能把这些信息提供给仿真工具*。这条特别指令是提醒编译工具,case语句是fully defined的,输出对于没用用到的case是"don't care"的。当用此条指令时,pre-和post-synthesis的仿真可能会不同。此外,尽管此条指令是告诉编译工具把未用的的情况视为“不处理”,这条指令有时会使设计比忽略full_case时更大和更慢 · module code4a (y, a, en); ·    output y; ·    input  a; ·    input        en; ·    reg    y; ·    always @(a or en) begin ·      y = 4'h0; ·      case ({en,a}) ·        3'b1_00: y = 1'b1; ·        3'b1_01: y = 1'b1; ·        3'b1_10: y = 1'b1; ·        3'b1_11: y = 1'b1; ·      endcase ·    end · endmodule 在code4a中case没有综合指令,结果是三输入与门和一个反相器。pre-和post-synthesis仿真是一致的。   · module code4b (y, a, en); ·    output y; ·    input  a; ·    input        en; ·    reg    y; ·    always @(a or en) begin ·      y = 4'h0; ·      case ({en,a}) // synopsys full_case      3'b1_00: y = 1'b1; ·        3'b1_01: y = 1'b1; ·        3'b1_10: y = 1'b1; ·        3'b1_11: y = 1'b1; ·      endcase ·    end · endmodule   在code4b中case语句带综合指令full_case,正是因为此,在综合时en输入被优化掉而成为一个悬挂的输入。code4a和code4b综合前的仿真结果以及code4a综合后的结果都是一致的,而它们是与code4b综合后的结果不同的。   4.2 Parael Case *用编译指令//synopsys parallel_case 给编译工具更多的关于设计的信息,而不能把这些信息提供给仿真工具*。这条编译指令是告诉编译器所有的情况是并行执行的,尽管有重叠的情况(这种情况通常会形成一种优先编码器)。当设计中有重叠的case时,pre-和post-synthesis 的仿真结果将会不同。在某些情况,用这条指令会使设计变得更大和更慢。 添加parallel_case的一个目的是优化面积和速度。*优先编码器行为的RTL模型通过了RTL级测试,但是如果在门级测试时忽略了这个漏洞(它其实是没有优先级的并行逻辑),导致的结果就是,设计是错误的,但是bug直到ASIC原型交货前也没有发现,那么在高度的金钱和时间成本下,ASIC必须重新设计。* · module code5a (y, z, a, b, c, d); ·    output y, z; ·    input  a, b, c, d; ·    reg    y, z; ·    always @(a or b or c or d) begin ·      {y, z} = 2'b0; ·      casez ({a, b, c, d}) ·        4'b11??: z = 1; ·        4'b??11: y = 1; ·      endcase ·    end · endmodule   code5a会被被综合成成具有优先编码器的功能的逻辑。但是code5b却被综合成两个and门。 · module code5b (y, z, a, b, c, d); ·    output y, z; ·    input  a, b, c, d; ·    reg    y, z; ·    always @(a or b or c or d) begin ·      {y, z} = 2'b0; ·      casez ({a, b, c, d}) // synopsys parallel_case ·        4'b11??: z = 1; ·        4'b??11: y = 1; ·      endcase ·    end · endmodule   综合工具指令//synopsys parallel_case的使用将导致具有优先编码器功能的逻辑实现成并行逻辑,从而导致综合前后的不匹配。 4.3 Casex casex语句的使用也会导致设计问题。casex把'X'视为'don't care'(如果它们出现在case表达式和case条目里)。casex所导致的问题会在casex表达式的输入被初始化成不定值时出现。在处理casex语句时,综合前仿真会把不定值视为'don't care'。综合后的仿真把'X'在门级的模型中传递。 有个公司在他们的设计中使用了casex语句。casex语句的输入在复位后成为不定值,因为综合前RTL仿真把未知的输入视为'don't care',casex语句错误地初始化设计在工作状态,而门级仿真并不够复杂或者说详细以致于没有发现这个错误,从而使递交的ASIC带着严重的bug。 · module code6 (memce0, memce1, cs, en, addr); ·    output         memce0, memce1, cs; ·    input          en; ·    input  addr; ·    reg            memce0, memce1, cs; ·    always @(addr or en) begin ·      {memce0, memce1, cs} = 3'b0; ·      casex ({addr, en}) ·        3'b101: memce0 = 1'b1; ·        3'b111: memce1 = 1'b1; ·        3'b0?1: cs     = 1'b1; ·      endcase ·    end · endmodule   code6是一个带着enable信号的简单的地址解码器,有时外部接口的设计错误会导致enable信号初始化后在被设置成一个有效状态之前成为不定值。当enable处于未知状态时,case选择器基于addr信号错误地匹配case选项。这个初始化的问题只有在post-synthesis仿真时出出现。一个类似的情况就是,当en有效,地址线的MSB位成为不定值时。这将会导致memce0或者memce1有效,而不管片选cs信号是否有效。 *使用原则*:出现不定值信号时很容易的,最好用casez语句而不用casex语句。 4.4 casez casez语句会导致和casex相同的设计问题,只不过它在验证时更容易被发现。用casez当输入被初始化成高阻态时就会出现问题。但是casez是设计很多结构的一种简洁和有效的方式,如优先编码器,中断处理器,和地址解码器。因此当设计工程师再用HDL设计某些结构时应该考虑用casez语句。 · module code7 (memce0, memce1, cs, en, addr); ·    output         memce0, memce1, cs; ·    input          en; ·    input  addr; ·    reg            memce0, memce1, cs; ·    always @(addr or en) begin ·      {memce0, memce1, cs} = 3'b0; ·      casez ({addr, en}) ·        3'b101: memce0 = 1'b1; ·        3'b111: memce1 = 1'b1; ·        3'b0?1: cs     = 1'b1; ·      endcase ·    end · endmodule   code7是与code6相同的带enable信号的简单地址解码器,只不过它用casez替换了casex。当某个输入成为高阻态而不是有效值时,它会与code6产生相同的问题。同样,错误的case匹配会发生(取决于case语句输入的状态)。然而,casez语句的匹配(浮置输入(floating input)或者三态驱动信号)比cazex语句匹配(信号成为不定值)可能性要小得多。*但是casez语句在设计地址解码器和优先编码器的时候是很有用的* *使用原则*:在RTL级谨慎使用casez语句。 5.0 初始化 5.1 'X'初始化 当在RTL代码中复制时,有时会被赋给'X'值。'X'被Verilog仿真器解释为不定值(casex例外),但是会被综合工具当做'don't care'。赋值成'X'会导致综合前后仿真的不一致。但是赋值成'X'值也是一种有用的技巧。在FSM设计中,存在未用到的状态时,把状态变量赋值成'X'可以帮助调试状态转换。这是在进入case状态之前把状态寄存器赋值成'X'值(它是为所有的不正确的状态而准备)。切记,综合工具将把任何的'X'值解释为'don't care'。 · module code8a (y, a, b, c, s); ·    output      y; ·    input       a, b, c; ·    input s; ·    reg         y; ·    always @(a or b or c or s) begin ·      y = 1'bx; ·      case (s) ·        2'b00: y = a; ·        2'b01: y = b; ·        2'b10: y = c; ·      endcase ·    end · endmodule   · module code8b (y, a, b, c, s); ·    output      y; ·    input       a, b, c; ·    input s; ·    reg         y; ·    always @(a or b or c or s) ·      case (s) ·        2'b00:        y = a; ·        2'b01:        y = b; ·        2'b10, 2'b11: y = c; ·      endcase · endmodule   code8a和code8b是3选1选择器的简单的Verilog模型。如果一旦case的2'b11情况发生,code8a的编码风格会造成仿真的不一致。而在code8b中则不会发生这种情况。而这种不匹配在2'b11情况永远不会发生时是有用的,因为一旦2'b11情况发生,y的仿真输出就会是不定值。 5.2 用translate_off/translate_on初始化设计 在translate_off和translate_on,对于综合工具是不可见的,而仿真工具可以。这样就会造成综合前后仿真的不一致,有可能在综合前仿真中初始化是正确的,但是在初始化之后,结果就不正确了。 · module code9 (y1, go, clk, nrst); ·    output y1; ·    input  go, clk, nrst; ·    reg    y1; ·    parameter IDLE = 1'd0,      BUSY = 1'd1; ·    reg state, next; ·    // Hiding the initialization of variables from the ·    //   synthesis tool is a very dangerous practice!! ·    // synopsys translate_off ·      initial y1 = 1'b1; ·    // synopsys translate_on ·    always @(posedge clk or negedge nrst) ·      if (!nrst) state = IDLE; ·      else       state = next; ·    always @(state or go) begin ·      next = 1'bx; ·      y1   = 1'b0; ·      case (state) ·        IDLE: if (go)    next = BUSY; ·        BUSY: begin          if (!go) next = IDLE;                   y1   = 1'b1;        end ·      endcase ·    end · endmodule translate_off/translate_on的初始化部分,会导致综合前后仿真结果的不一致。 6.0 translate_off/translate_on的一般用法 translate_off/translate_on综合指令应该谨慎使用。它们在显示设计的信息时是非常有用的,但是当它被用来模拟某种功能时是很危险的。一个例外是异步复位和置位的D触发器。他要求用非综合的模型提供正确的综合前仿真模型以和综合后模型匹配。这种条件按以下方式创建:置reset有效,置set有效,置reset无效,使set继续有效。在这种情况,D触发器模型需要一点辅助来在综合前阶段正确建模set条件。这是由于在always块里只有在set/reset的边沿时才会触发。当输入是异步的,一旦reset信号被去除,set就会有效,但是这种情况不会发生,因为always块不能被触发。为了解决这个问题,可以用translate_off/translate_on指令强制输出正确的值。*最好的方法就是尽可能避免异步set/reset触发器的使用。 · // Generally good DFF with asynchronous set and reset · module code10a (q, d, clk, rstn, setn); ·    output q; ·    input  d, clk, rstn, setn; ·    reg    q; ·    always @(posedge clk or negedge rstn or negedge setn) ·      if      (!rstn)  q = 0;  // asynchronous reset ·      else if (!setn)  q = 1;  // asynchronous set ·      else             q = d; · endmodule · // synopsys translate_off · // Bad DFF with asynchronous set and reset.  This design · //   will not compile from Synopsys, and the design will · //   not simulate correctly. · module code10b (q, d, clk, rstn, setn); ·    output q; ·    input  d, clk, rstn, setn; ·    reg    q; ·    always @(posedge clk or rstn or setn) ·      if      (!rstn)  q = 0;  // asynchronous reset ·      else if (!setn)  q = 1;  // asynchronous set ·      else             q = d; · endmodule · // synopsys translate_on · // Good DFF with asynchronous set and reset and self- · //   correcting · // set-reset assignment · module code10c (q, d, clk, rstn, setn); ·    output q; ·     input  d, clk, rstn, setn; ·    reg    q; ·    always @(posedge clk or negedge rstn or negedge setn) ·      if      (!rstn)  q = 0;  // asynchronous reset ·      else if (!setn)  q = 1;  // asynchronous set ·      else             q = d; ·    // synopsys translate_off ·      always @(rstn or setn) ·        if   (rstn !setn) force q = 1; ·        else                 release q; ·    // synopsys translate_on · endmodule   code10a在仿真时%99的情况是正确的,但是当rstn的上升沿来到时,如果setn一直是低电平,always块是不被触发的,这导致了仿真的不正确。而在code10b中不管是综合前后的仿真,还是综合本身,都会是错误的。而code10c会100%仿真正确,综合前后的仿真也会匹配,它使用translate_off/translate_on综合指令,强制使输出输出正确的值。(这确实是很有意思)。 7.0 延时 在always块中,如果不在0时间点上有延时,就会错过RTL或者行为级的触发事件。 · module code11 (out1, out2, in); ·    output out1, out2; ·    input  in; ·    reg    out1, out2; ·    always @(in) begin ·      #25 out1 = ~in; ·      #40 out2 = ~in; ·    end · endmodule 在code11中,在赋值语句的左端添加了延时,将导致综合前后仿真结果的不一致。首先,一旦敏感列表中的in变量变化时,就会进入always块,之后的65个时间单元内in的变化将不在重新出发always块。第二,25个时间单元的延迟后,in的值将被读取,取反,传送给out1,再过40个时间单元后,in的值将再一次被读取,取反,传送给out2。在延迟的过程中,所有的发生在in上的事件都将被忽略。如果任何输入的变化频率比每65个时间单元快,在code11的输出端不会有更新。综合之后的门级模型将仿真成两个反相器,而综合前的RTL代码将错失很多输入的变化。*在alway块中的赋值语句的左端加入延时,并不能精确进行RTL和行为级的建模*。 8.0 总结 知道那一种编码风格会导致综合前后的仿真结果不一致,理解为什么不一致会发生,并且避免容易出错的编码风格将大大减少RTL设计中的漏洞和修补这些不匹配所花的调试时间。由于ASIC的尺寸正在持续增加,综合后运行100%覆盖率的回归测试越来越不可能。设计者必须能够在设计过程中的用所有可能的方法尽早减少风险。     在项目进行过程中,根据自己的经验,总结各大公司的相关文档,创建了自己的编码守则,内容不多,也不教条,适合自己用,大家也可以看看。先来说说这几项守则的目标,任何东西都是在一定的目标和评价体系下,才有其真实的意义。 目标 - 方便施加综合约束 - 很好的设计可读性 - 可重用性 - 可测试行 - 有助简化静态时序分析 - 门级电路行为与RTL代码一致 大家注意比较这几点。 文件风格 1. 一个文件内只能有一个模块 不知道为什么有些人要把多个模块放在一个文件里面,这样可以省很多资源吗? 多个模块在一个文件里面造成的结果是,工具既加载了我们需要的模块,也同时加载我们不需要的模块。如果这不是你愿意看到的,那么就不要把多个模块放在一个文件里。 2. 文件名与模块名一致 做工程的人要深刻理解“简单”的美学和哲学。越简单、越土,做出来的东西越稳定。文件名和模块名的一致,就是出于这样的哲学,当两者一致的时候,从代码阅读、理解到EDA工具加载,都具有非常好的直观性。 3. 文件名与模块名大写 这是一个推荐的原则,你完全可以采取小写。但是这样做的好处是,模块名在代码中非常显眼,容易识别。显眼的目的是提高代码的可读性,这样重点突出,方便阅读理解。 4. 撰写文件头 这是每个RTL作者都希望读到,但是自己又懒得去做的部分。你想想是不是?所谓己所不欲,勿施于人。我们都讨厌没有头部说明的文件,那么自己写的东西,也尽量把这些信息补充完整吧。说到头部文件,我个人认为,不要像Xilinx Core Gen之类产生的头文件那么详细,把模块的简介和作者、版本等信息用简单明了的方式补充上即可。 端口风格 1. 端口信号用大写 理由同文件名和模块名大写,也是推荐而已。 2. 输入输出信号用 i_ 和 o_ 前缀明示 读代码的时候,了解信号是内部的还是接口的,及其输入输出方向很有必要。这样对于把握结构和数据流很有帮助。不理解的朋友通过实践,慢慢体会吧。 时钟风格 1. 时钟名称采用频率作为后缀 比如 i_CLK 修改为 i_CLK_40,以表明该时钟工作在40MHz下,这样在仿真或者综合的时候,非常容易比对,可以及时发现时钟与标称值不一致引起的问题。 2. 不要在内部创造门控时钟 3. 只使用时钟上升沿 这个话题我们有专贴讲述,大家可以去看看。主要是违反了DFT设计原则,所以需要慎重。 4. 不能将data作为时钟使用 将普通信号作为时钟使用,这也是不允许的,尽量把这种实现修改成用该信号做使能信号的方式。之所以要避免这种用法,也是因为违反了DFT原则。因为用于test的扫描链,都使用同一个时钟树,这样才能实现测试数据的移位输入与输出,但是采用了普通信号作为时钟的寄存器不在这个时钟树内,因此也无法进入扫描链,造成部分电路不可测试。 5. 不能将时钟用作普通信号参与运算 以下是我个人理解,不一定正确。(这种用法对生成时钟数和生成扫描链造成重大挑战。时钟信号相当于产生了非常大的延迟,而且由于逻辑部分的渗入,使得末端的时钟行为非常复杂。所以要么就是时钟树在此断裂,要么就产生非常复杂的派生时钟,以上种种都破坏了时钟的简单性和纯粹性。) 复位风格 1. 不要在模块内创建门控复位并使用之。 2. 异步复位只使用下降沿 3. 不要将data作为异步复位使用 4. 不要将异步复位信号作为数据使用 5. 明明白白使用异步复位和同步复位 6. 用后缀指示复位是高有效还是低有效 例化风格 1. 例化子模块时,端口映射一定要采用显式名称映射方式,比如 .clk (i_clk), 2. 端口映射时,信号名称尽量相同或者类似 3. 用于端口连接的信号用前缀 w_ 表示 这里,我想推荐一个命名规则,是我一直在用的,但是觉得非常好,大家可以参考一下,但是每个人都可以不一样,有自己的原则就行。 i_ :输入 o_:输出 r_ :内部寄存器 c_:内部组合逻辑 w_:模块间连线 逻辑风格 1. 输入信号都要FF锁存后使用 2. 输出信号都要FF锁存后输出 3. 严禁组合环(组合环的存在可以通过综合警告来确认) 4. case语句必须有default 5. if 语句必须清楚优先顺序 6. 少用if-else,多用case 7. 不要使用latch 8. 硬件实现尽量简单,比如乘以2的运算,可以用左移1位来代替 9. 不要使用不可综合的语句 10. 明明白白使用阻塞和非阻塞语句 存储器风格 1. 时钟用上升沿 2. CEN和WEN用低有效 3. Dual port memory 和 2-port memory 不要同时访问同一地址 4. memory的write mode 必须使用2。也就是read after write,其他的模式,比如read before write,有可能不能实现。 5. memory的命名采用下面规则 类型_depth x width 类型包括 dual port, two port, single port, rom。 FPGA风格 1. FPGA使用的内容要单独规划,方便ASIC的移植。这个方法很多,大家选自己擅长的  
相关资源
  • 所需E币: 4
    时间: 2020-4-3 15:51
    大小: 3.12KB
    上传者: 238112554_qq
    GPS技术方案(综合)GPS/GPRS指挥、调度、运营、管理中心系统技术应用简介详情请登录www.carboter.com公司技术部0532-83803212、83801539[pic]青岛卡波特电子科技有限公司感谢信尊敬的领导:首先感谢您在百忙之中抽出宝贵的时间,审阅由我们提供的GPS/GPRS全球卫星定位系统技术方案及应用方案。本方案是在认真听取了贵方的要求、需求、现场情况等因素,由我公司组织技术、生产方案组,据您需求,在科学性、实用性、前瞻性的前提下而客需化制定的。我们郑重承诺,以下方案科学、实用、稳定、可靠。所提供的技术参数符合国家相关标准,企业标准,所附企业资质材料真实可查,并愿积极配合对我方的考察,此预案一经你的初步认可,我们愿对您此项目的实施、运作提出我们的建议,供您参考。请相信我们,相信实力!最后,愿我们双方在务实、科学的前提下紧密合作,实现共赢!……
  • 所需E币: 3
    时间: 2019-12-25 15:59
    大小: 7.84MB
    上传者: 978461154_qq
    qurtues-II中文教程QuartusII简介AlteraCorporation101InnovationDriveSanJose,CA95134(408)544-7000www.altera.comQuartusII简介版本5.0第一次修订2005年4月P25-09235-04Altera、Altera标识、FastTrack、HardCopy、MAX、MAX+PLUS、MAX+PLUSII、MegaCore、MegaWizard、NativeLink、Nios、OpenCore、Quartus、QuartusII、QuartusII标识和SignalTap是Altera公司在美国和其它国家的注册商标。Avalon、ByteBlaster、ByteBlasterMV、Cyclone,Excalibur,IPMegaStore,Jam,LogicLock,MasterBlaster,MegaLAB,PowerFit,SignalProbe,Stratix和USB-Blaster是Altera公司在美国和其它国家的商标以及服务标志。Altera公司使用的产品设计单元和助记符受版权法以及商标法的保护。Altera公司承认本文档提及的其它组织的产品或商标以及服务标志,特别是:ARM是注册商标,AMBA是ARM公司的商标。Mento……
  • 所需E币: 4
    时间: 2020-1-4 12:45
    大小: 34.75KB
    上传者: quw431979_163.com
    数字频率计的VHDL程序设计……
  • 所需E币: 5
    时间: 2019-12-25 03:42
    大小: 17.17MB
    上传者: wsu_w_hotmail.com
    Synplify9.6.2下载……
  • 所需E币: 5
    时间: 2020-1-4 23:14
    大小: 70.32KB
    上传者: wsu_w_hotmail.com
    综合中的metalogicalvalue……
  • 所需E币: 3
    时间: 2020-1-4 23:32
    大小: 144.39KB
    上传者: wsu_w_hotmail.com
    Verilog编码与综合中的非阻塞性赋值(中文)……
  • 所需E币: 5
    时间: 2020-1-5 21:33
    大小: 677.5KB
    上传者: 2iot
    电子元器件综合知识大全1.5电阻器的单位换算:1兆欧=103千欧=106??1.61.9电阻器的在电路中的参数标注方法有3种,即直标法、色标法和数标法??用百分数表示,未标偏差值的即为±20%.b、数码标示法主要用于贴片等小体积的电路,在三为数码中,从左至右第一,二位数表0=0Ω.标称值第二位有效数字允许误差||??|0|0|[pic]|||??|1|1|[pic]|±1%||??|2|2|[pic]|±2%||??|3|3|[pic]|||??|4|4|[pic]|||??|5|5|[pic]|±0.5%……
  • 所需E币: 3
    时间: 2019-12-24 10:39
    大小: 212.37KB
    上传者: 978461154_qq
    AVR-LCD菜单综合系统设计(程序原理图……
  • 所需E币: 4
    时间: 2020-1-9 15:03
    大小: 1.02MB
    上传者: 238112554_qq
    技术综合—企业文件卡波特GPS/GPRS系统技术方案0GPS/GPRS指挥、调度、运营、管理中心系统技术应用简介详情请登录www.carboter.com公司技术部0532-83803212、83801539青岛卡波特电子科技有限公司0青岛卡波特电子科技有限公司地址:青岛市北区沾化路4号3楼电话:0532-838032128380208683801539传真:0532-83801539Http://www.carboter.comE-mail:info@carboter.com卡波特GPS/GPRS系统技术方案1感尊敬的领导:谢信首先感谢您在百忙之中抽出宝贵的时间,审阅由我们提供的GPS/GPRS全球卫星定位系统技术方案及应用方案。本方案是在认真听取了贵方的要求、需求、现场情况等因素,由我公司组织技术、生产方案组,据您需求,在科学性、实用性、前瞻性的前提下而客需化制定的。我们郑重承诺,以下方案科学、实用、稳定、可靠。所提供的技术参数符合国家相关标准,企业标准,所附企业资质材料真实可查,并愿积极配合对我方的考察,此预案一经你的初步认可,我们愿对您此项目的实施、运作提出我们的建议,供您参考。请相信我们,相信实力!最后,愿我们双方在务实、科学的前提下紧密合作,实现共赢!青岛卡波特电子科技有限公司董事长:唐国祥总经理:于秀珍1青岛卡波特电子科技有限公司地址:青岛市北区沾化路4号3楼电话:0532-838032128380208683801539传真:0532-83801539Http://www.carboter.comE-mail:info@carboter.com卡波特GPS/GPRS系统技术方案2目一、客户需……
  • 所需E币: 3
    时间: 2020-1-9 17:07
    大小: 25.5KB
    上传者: quw431979_163.com
    IT项目综合计划模板(1)—项目整体介绍2.1IT项目综合计划模板(1)—项目整体介绍|IT项目整体介绍:||项目名称:||项目发起人:||项目经理或主要负责人:||项目起始、结束时间:||项目概述:||项目可交付成果:||重要资料清单:||有关定义和缩写说明:|……
  • 所需E币: 5
    时间: 2020-1-13 13:20
    大小: 135.01KB
    上传者: 二不过三
    便携设备中供电电路的综合考虑便携设备中供电电路的综合考虑_________________________________________________________________________________________________________________便携设备中供电电路的综合考虑MAXIM北京办事处栾成强在便携设备和无线产品的设计中,设计人员常常面临如何提高产品性能、进一步延长电池工作时间的挑战,由于对成本和体积的要求比较苛刻,设计中会牺牲系统的某些指标而采取一些折衷的解决方案。新型供电电路的出现弥补了以上设计中的不足,能够保证系统高可靠性、高性能指标的要求,并有效地延长电池寿命。供电电路的主要参数有成本、效率(电池寿命)、输出纹波、噪声及静态电流。表一列出了这些参数与电路结构、输入输出电压范围的相互关系,下面我们就结合表一,进一步阐述这些电路结构的特点。一.低压差(LDO)线性稳压器低压差线性稳压器的突出优点是具有最低的成本,最低的噪声和最低的静态电流。它的外围器件也很少,通常只有一两个旁路电容。新型LDO可达到以下指标:30μV输出噪声、60dBPSRR、6μA静态电流及100mV的压差。LDO线性稳压器能够实现这些特性的主要原因在于内部调整管采用了P沟道场效应管,而不是通常线性稳压器中的PNP晶体管。P沟道的场效应管不需要基极电流驱动,所以大大降低了器件本身的电源电流;另一方面,在采用PNP管的结构中,为了防止PNP晶体管进入饱和状态降低输出能力,必须保证较大的输入输出压差;而P沟道场效应管的压差大致等于输出电流与其导通电阻的乘积,极小的导通电阻使其压差非常低。当系统中输入电压和输出电压接近时,LDO是最好的选择,可达到很高的效率。所以在将锂离子电池电压转换为3V电压的应用中大……
  • 所需E币: 3
    时间: 2020-1-13 13:43
    大小: 2.34MB
    上传者: 238112554_qq
    DCDC资料打包,DCDC综合……
  • 所需E币: 5
    时间: 2020-1-13 18:11
    大小: 2.32MB
    上传者: 978461154_qq
    哈工大微波网络分析与综合讲座,哈工大微波网络分析与综合讲座……
  • 所需E币: 4
    时间: 2020-1-13 18:49
    大小: 134.88KB
    上传者: 二不过三
    X波段雷达频率综合器维普资讯http://www.cqvip.com。一她术第26卷x波段雷达频率综合器。高树廷(西安电子工程研究所西安710100)':-/v7, ̄-L【摘要】论述X波段雷达频率综合器的方案、用直接合成与间接合成相结合的方法实现直接锁定X波段VCO的设计方法及关键技术措施。并给出达到的主要技术指标、测试结果和测量方法。关键调:雷达频率综合器相位噪声塑塑块化1概述>({1=l漩笈现代雷达品种、型号都很多,但往往都采用相干体制,不仅使用幅度信息,还要利用相位和频率信息,使雷达性能更优良。随着电子对抗的发展,抗有源和无源干扰的需要,还要求雷达信号的相位和频率都有很高的稳定度,而且能够频率捷变.X波段雷达频率综合器就是为某炮位侦校雷达设计的雷达频率源,能适应于相频扫相阵体制,同时要求雷达改善因子很高,因此频率源在雷达中占据非常重要的位置。雷达频率源一般至少要向雷达提供发射机的脉冲调制激励信号,接收机的第―本振信号,第二本振信号及相参基准信号,同时还需提供雷达定时基准信号。激励信号与第―本振信号―般为宽带并能频率捷变,整个频率源能接收雷达站控制又能独自工作。本雷达频率综合器经多年研制,不仅具备上述功能,丽耳输出具有很低的相位噪声,在X波段l0的带宽,偏离lkHz达--lOOdBc/Hz。各频率点转换速度小于ls,实现了模块化设计。2方案设计2.1……
  • 所需E币: 4
    时间: 2020-1-14 10:44
    大小: 1.59MB
    上传者: 微风DS
    微波仿真论坛_DVB-T_接收机中频率综合器的研究1学校代码:10246学号:021021053博士学位论文DVB-T接收机中频率综合器的研究院专姓系:微电子学系业:微电子学与固体电子学名:何捷指导教师:洪志良教授闵昊教授完成日期:2005年4月20日复旦大学博士学位论文DVB-T接收机中频率综合器的研究何捷指导教师:洪志良闵昊教授教授指导小组:洪志良闵昊教授教授教授教授任俊彦杨莲兴复旦大学信息科学与工程学院微电子学系复旦大学博士学位论文摘要本文从应用于数字地面电视广播DVB-T接收机中的频率综合器研究为出发点,首先,简单介绍了DVB-T接收机对频率综合器的性能要求,概括了频率综合器的结构和分析方法。在此基础上,着重研究了频率综合器的环路参数设计和噪声估计方法,并采用TSMC0.25mCMOS工艺设计了一个窄带的频率综合器加以验证。在环路参数设计方面,本文定量分析了环路参数由于工艺、电压和温度等条件的变化对整个环路稳定性的影响,并在此基础上,提出了基于稳定性优化的环路参数设计方法。在噪声估计方法,建立了对电荷泵等效噪声估算的采样噪声模型,并且进一步的采用了基于环路的噪声参数模型和基于性能指标的噪声参数模型来估算整个环路的相位噪声。在电路设计方面,详细的论述了各个模块的实现方法。研究了差分电荷泵存在的问题并提出了相应的改进技术,同时依据稳定性分析提出了结构简单的稳定性补偿电荷泵;另外本文还提出了采用开关阶跃变容器的全差分压控振荡器电路;并研究总结了低噪声分频器的原理和电路结构。最后,通过仿真和芯片测试,验证了本文提出的基于稳定性优化的参数设计方法,以及电荷泵的采样等效噪声模型的准确性和环路噪声估计方法的可行性;也验证了新电……
  • 所需E币: 3
    时间: 2020-1-14 11:41
    大小: 1.38MB
    上传者: 16245458_qq.com
    hp8920A的中文操作说明,HP8920综合测试仪说明书……
  • 所需E币: 3
    时间: 2020-1-14 14:14
    大小: 200.3KB
    上传者: givh79_163.com
    级联传输线阻抗变换器的计算机综合设计维普资讯http://www.cqvip.com笫18卷第2期无线电通信技术WUXIANDIANTONGXINJISHURadioCommtlnicatioI1STechnologyVo1.18No.21992年4月―:j―=一==一==。.・APr.1992£论文・\弋}、级联传输线阻抗变换器的计算机综合设计秦顺友(机电部石家庄第54研究所)Cf摘要本文运用散射矩阵方程导出了两端口元耗匹配网络条件,推导亍级联传输线阻抗变换器的设计公忒。给出了计算机综合设计程序框图。最后,给出了两个设计实例,且与l/4波长阻抗变换器进行了比较。、,关键词散射矩阵匹配网络传输线反射系数套c一――一,1引言众所周知,征微波传蝓系统中,1/4 ̄1t抗变换器有着广泛的应用。但是在任意给定负载情况下,】厂4波长阻抗变换的尺寸不一定是最小的,而且它的尺寸和特性阻抗均被确定,没有进一步选择的余地,利用级联传输线阻抗变换器就可解决尺寸小型化的问题,而且其特性阻抗可适当地进行选择。一般情况下,常采用阻抗匹配方法分析设计阻抗变换器,而本文利用散射矩阵方法,导出了两端口无耗网……
  • 所需E币: 4
    时间: 2020-1-14 18:02
    大小: 627.22KB
    上传者: 二不过三
    逻辑综合BuildGate.pdf,逻辑综合BuildGate[1]……
  • 所需E币: 5
    时间: 2020-1-14 18:04
    大小: 143.52KB
    上传者: 二不过三
    利用DC进行逻辑综合--中文,利用DC进行逻辑综合……
  • 所需E币: 3
    时间: 2020-1-14 18:06
    大小: 166.08KB
    上传者: givh79_163.com
    逻辑综合中对关键路径处理方法的研究,逻辑综合的研究……