如何使用具有恒定长度的二进制数

时间:2018-03-24 14:05:56

标签: verilog

我正在尝试为动态大小的寄存器编写test_bench。 我像这样定义了一个参数变量并实例化了一个寄存器模块:

  parameter integer regSize = 8;

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

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

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

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

我收到此错误:

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

我该怎么写呢?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用连接重复结构:

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位计数器可能是一个设计错误。

答案 1 :(得分:0)

无需在Verilog中填写0到一个数字,它会自动为您执行此操作。你可以做到

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