代码之家  ›  专栏  ›  技术社区  ›  Kamran Hosseini

如何获得长度恒定的二进制数

  •  0
  • Kamran Hosseini  · 技术社区  · 7 年前

    我正在尝试为动态大小寄存器编写一个test\u测试台。 我这样定义了一个参数变量,并实例化了一个寄存器模块:

      parameter integer regSize = 8;
    
      register #(.size(regSize)) R1 (
       .clock(clk),
       .reset(rst),
       .enable(enb),
       .regIn(in),
       .regOut(outp)
      );
    

    例如,我想定义“in”变量(模块的第四个输入)

      reg [regSize - 1: 0] in = (regSize)'b0;
    

    我希望它的作用如下: reg [regSize - 1: 0] in = 8'b0; 但事实并非如此。

    我收到以下错误:

    near "'b": syntax error, unexpected BASE, expecting ';' or ','
    

    我该怎么写?

    谢谢你的帮助。

    2 回复  |  直到 7 年前
        1
  •  2
  •   dave_59    7 年前

    使用串联重复结构:

    reg [regSize - 1: 0] in = {regSize{1'b0}};
    

    或者在System Verilog中,您可以执行以下操作:

    reg [regSize - 1: 0] in = '0;
    

    您可能还需要一些类似的东西来将例如1添加到具有可变长度的计数器:

    ...
    counter <= counter + {{(regSize-1){1'b0}},1'b1}; // regSize>1!
    

    由于这变得难以阅读,我更喜欢使用localparam:

    localparam [regSize-1:0] value_1 = {{(regSize-1){1'b0}},1'b1}; // regSize>1!
       ...
       counter <= counter + value_1;
    

    请注意,如果您还希望宽度为1位,那么它可能会变得相当混乱,但我假设将1添加到1位计数器可能是一个设计错误。

        2
  •  0
  •   dave_59    7 年前

    在Verilog中,不需要将0填充到数字,它会自动为您执行此操作。你可以这么做

    reg [regSize - 1: 0] in = 0;