【问题标题】:' << ' operator in verilogVerilog 中的“<<”运算符
【发布时间】:2013-07-17 04:43:06
【问题描述】:

我有一个verilog代码,其中有一行如下:

parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;

RAM_DEPTH 中将存储什么,&lt;&lt; 运算符在此处做什么。

【问题讨论】:

    标签: operator-keyword verilog


    【解决方案1】:

    &lt;&lt;是二进制移位,将1左移8位。

    4'b0001 << 1 => 4'b0010
    

    &gt;&gt; 是在 MSB 上加 0 的二进制右移。
    &gt;&gt;&gt; 是在左输入有符号时保持 MSB 值的有符号移位。

    4'sb1011 >>  1 => 0101
    4'sb1011 >>> 1 => 1101
    

    表示左操作数有符号的三种方式:

    module shift;
      logic        [3:0] test1 = 4'b1000;
      logic signed [3:0] test2 = 4'b1000;
    
      initial begin
        $display("%b", $signed(test1) >>> 1 ); //Explicitly set as signed
        $display("%b", test2          >>> 1 ); //Declared as signed type
        $display("%b", 4'sb1000       >>> 1 ); //Signed constant
        $finish;
      end
    endmodule
    

    【讨论】:

    • 谢谢.. :) 也感谢分享'>>>' 运算符的概念.. :)
    • >>> 运算符仅在移位的操作数有符号时才保留 MSB。如果移位的操作数是无符号的,如您的示例所示,则 >>> 运算符插入零,就像 >> 运算符一样。
    • $signed(test1) &gt;&gt;&gt; 1 不适合我。 Xilinx ISE 与 ISim。
    • @Yvon 它应该可以工作,除非 Xilinx ISE 中出现错误,否则您可以发布一个带有您尝试的代码示例的问题。否则请在 eda playground 上试用。
    • @Morgan 我将你的第二个代码块粘贴到 ISim 中,上面写着 Syntax error near "signed".logic is an unknown type。 ISim 似乎无法识别这些关键字。
    【解决方案2】:

    1 &lt;&lt; ADDR_WIDTH 表示 1 将向左移动 8 位并将分配为 RAM_DEPTH 的值。

    另外,1 &lt;&lt; ADDR_WIDTH也表示2^ADDR_WIDTH。

    给定ADDR_WIDTH = 8,然后是2^8 = 256,这将是RAM_DEPTH的值

    【讨论】:

      【解决方案3】:

      &lt;&lt; 是左移运算符,就像在许多其他语言中一样。

      这里的RAM_DEPTH 将被1 左移8 bits,相当于2^8256

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多