0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTL表达式和运算符

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-10-11 10:15 次阅读

数字硬件建模SystemVerilog-归约运算符(Reduction operators)

经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式和运算符。

马上HDLBits-SystemVerilog版本也开始准备了,基本这一部分完成后就开始更新~

55939fba-4902-11ed-a3b6-dac502259ad0.png

介绍

归约运算符对单个操作数的所有位执行运算,并返回标量(1位)结果。表5-9列出了归约运算符。

55c78f6e-4902-11ed-a3b6-dac502259ad0.png 表5-9:RTL建模的归约运算符

归约运算符包括一个NAND和一个NOR运算符,这是按位运算符所没有的。归约AND OR 和 XOR 运算符一次执行一位操作,从最右边的位(最低有效位)向最左边的位(最高有效位)移动。归约NAND、NOR和XNOR运算符首先分别执行归约AND、OR或XOR运算,然后反转1位结果。

AND、NAND或NOR运算符是X-optimistic。对于归约运算符,如果操作数中的任何位为0,结果将为1’b0。对于归约NAND,如果操作数中的任何位为0,结果将为1’b1。类似地,对于归约运算符,或者如果操作数中的任何位为l,结果将为1’b1。对于归约NOR,如果操作数中的任何位为l,结果将是1’b0.归约XOR和XNOR运算符是X-pessimistic。如果操作数的任何一位是X或Z,结果将是1’bx。表5-10显示了几个示例值的每个归约运算符的结果。

表5-10:归约操作的示例结果 56a8f850-4902-11ed-a3b6-dac502259ad0.png

示例5-6说明了一个小型RTL模型,该模型利用归约运算符检查数据值的正确奇偶性,图5-6显示了该RTL模型综合结果。

示例5-6:使用归约运算符:使用异或的奇偶校验

//
//Book,"RTLModelingwithSystemVerilogforASICandFPGADesign"
//byStuartSutherland
//
//Paritycheckerusingevenparity,registerederrorflag
//
//Copyright2016,StuartSutherland.Allrightsreserved.
//
//Version1.0
//

//
//User-definedtypedefinitions
//
`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
packagedefinitions_pkg;
typedefstruct{
logic[7:0]data;
logicparity_bit;
}data_t;
endpackage:definitions_pkg
`end_keywords


//
//Paritycheckerusingevenparity,registerederrorflag.
//Thecombineddatavalueplusparitybitshouldalwayshave
//anevennumberofbitssetto1
//
`begin_keywords"1800-2012"//useSystemVerilog-2012keywords
moduleparity_checker
importdefinitions_pkg::*;
(inputdata_tdata_in,//9-bitstructureinput
inputclk,//clockinput
inputrstN,//active-lowasynchronousreset
outputlogicerror//setifparityerrordetected
);
timeunit1ns/1ns;

always_ff@(posedgeclk,negedgerstN)
if(!rstN)error<= 0;
   else       error <= ^{data_in.parity_bit, data_in.data};
     // reduction-XOR returns 1 if an odd number of bits are
     // set in the combined data and parity_bit
endmodule: parity_checker
`end_keywords

该文件的仿真文件如下:

//
//Book,"RTLModelingwithSystemVerilogforASICandFPGADesign"
//byStuartSutherland
//
//Testbench
//
//Copyright2016,StuartSutherland.Allrightsreserved.
//
//Version1.0
//
`begin_keywords"1800-2012"
moduletest
importdefinitions_pkg::*;
(outputlogicrstN,
outputdata_tdata_in,
inputlogicerror,
inputlogicclk
);
timeunit1ns/1ns;

//generatestimulus
initialbegin
$timeformat(-9,0,"ns",6);//nanoseconds,noprecision,6columns
rstN<= 0;                    // reset DUT (active low)
    repeat(2)  @(negedge clk) ;   // hold reset for 2 clock cycles
    rstN = 1;                     // remove reset
    repeat (10) begin
      @(negedge clk) ;
      data_in.data = $urandom();
      data_in.parity_bit = $urandom()%2;  // randomly wrong parity value
      @(negedge clk) check_results;
    end
    @(negedge clk) $finish;
  end

  // verify results
  task check_results;
    $write("At %t: data=%b  parity_bit=%b:  ", $time, data_in.data, data_in.parity_bit);
    if (^data_in.data === data_in.parity_bit) begin: good_data_in
      $write("Good data_in. EXPECT: error = 0, ACTUAL: %b ", error);
      if (error === 1'b0) $display(" OK");
      else                $display(" ERROR!");
    end: good_data_in
    else begin: bad_data_in
      $write("Bad data_in.  EXPECT: error = 1, ACTUAL: %b ", error);
      if (error === 1'b1) $display(" OK");
      else                $display(" ERROR!");
    end: bad_data_in
  endtask

endmodule: test
`end_keywords

`begin_keywords "1800-2012"
module top;
  timeunit 1ns/1ns;
  import definitions_pkg::*;
  parameter WIDTH = 8;

  logic  clk, rstN;
  data_t data_in;
  logic  error;

  test           test (.*);
  parity_checker dut  (.*);

  initial begin
    clk <= 0;
    forever #5 clk = ~clk;
  end
endmodule: top
`end_keywords

图5-6:示例5-6的综合结果:归约异或(奇偶校验)

56e12fc2-4902-11ed-a3b6-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTL
    RTL
    +关注

    关注

    1

    文章

    385

    浏览量

    59752
  • 运算符
    +关注

    关注

    0

    文章

    172

    浏览量

    11078

原文标题:SystemVerilog-归约运算符(Reduction operators)

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数字硬件建模SystemVerilog-按位运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 08-12 14:27 2576次阅读

    关于数字硬件建模SystemVerilog

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 09-01 08:50 1393次阅读

    C语言程序设计--运算符表达式

    c语言对数据有很强的表达能力,具有十分丰富的运算符,利用这些运算符可以组成各种表达式及语句。运算符就是完成某种特定
    发表于 07-14 21:30 46次下载

    单片机C语言教程-运算符表达式

    单片机C语言教程-运算符表达式   单片机C语言教程-运算符表达式  运算符的种类、优先级和结合性  c语言中运
    发表于 03-27 17:13 2218次阅读

    基于运算符信息的数学表达式检索技术

    传统的文本检索技术主要面向一维文本,难以用于对二维结构数学表达式的检索。针对该问题,通过引入公式描述结构,实现基于运算符信息的数学表达式检索。利用公式描述结构提取算法获取 Latex数学表达式
    发表于 04-29 15:58 2次下载
    基于<b class='flag-5'>运算符</b>信息的数学<b class='flag-5'>表达式</b>检索技术

    RTL表达式运算符

    运算符对操作数执行操作。大多数运算符都有两个操作数。
    的头像 发表于 07-21 09:11 1753次阅读

    RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 07-27 09:11 1717次阅读

    SystemVerilog-运算符/表达式规则

    RTL建模中广泛使用的运算符是条件运算符,也称为三元运算符,该运算符用于在两个表达式之间进行选择
    的头像 发表于 08-03 09:03 3100次阅读

    关于RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 09-01 09:13 1876次阅读

    RTL表达式运算符

    决策语句(Decision statements)允许程序块的执行流程根据设计中信号的当前值分支到特定语句。SystemVerilog有两个主要的决策语句:if…else语句和case语句,使用关键字case、case…inside,casex和casez。
    的头像 发表于 10-21 09:04 1335次阅读

    RTL表达式运算符

    经过几周的更新,SV核心部分用户自定义类型和包内容已更新完毕,接下来就是RTL表达式运算符
    的头像 发表于 11-03 09:14 1358次阅读

    运算符/表达式规则

    运算符对操作数执行操作。大多数运算符都有两个操作数。例如,在运算a+b中,+(加法)运算的操作数是a和b。每个操作数都被称为表达式
    的头像 发表于 02-09 15:37 976次阅读
    <b class='flag-5'>运算符</b>/<b class='flag-5'>表达式</b>规则

    逻辑运算符表达式

    在C语言中,我们通常会进行真值与假值的判断,这时我们就需要用到逻辑运算符与逻辑表达式。如果表达式的值不为0,则通通返回为真值。只有当表达式的值为0时,才会返回假值。
    的头像 发表于 02-21 15:16 2115次阅读
    逻辑<b class='flag-5'>运算符</b>与<b class='flag-5'>表达式</b>

    位逻辑运算符表达式

    位逻辑运算符与位逻辑表达式可以实现位的编辑,比如位的清零、设置、取反和取补等操作。使用位逻辑运算符与位逻辑表达式可以在不使用汇编的情况下实现部分汇编的功能
    的头像 发表于 02-21 15:22 1238次阅读
    位逻辑<b class='flag-5'>运算符</b>与<b class='flag-5'>表达式</b>

    C语言基本的算术运算符表达式

    注意:自增和自减运算符只能用于变量,而不能用于常量或表达式 **C语言算术表达式运算符的优先级与结合性 ** 在表达式求值时,
    的头像 发表于 03-09 10:44 1593次阅读