【问题标题】:Using parameters to create constant in verilog在verilog中使用参数创建常量
【发布时间】:2014-01-21 00:16:45
【问题描述】:

我想接受一个参数并将与该参数相等的零个数分配给一个常数,并使用该常数进行比较。我该怎么做 ?

比如说参数是3,我想创建一个常量

n=3'b000;

并在另一个语句中使用这个 n。唯一的问题是,我不知道。如何初始化“n”个零以及将其分配给什么 verilog 数据类型?

【问题讨论】:

标签: verilog


【解决方案1】:

您正在寻找复制运算符。语法是{replication_constant{value}}

创建大小为WIDTH 到全零的总线的示例。

parameter WIDTH = 3;
wire [WIDTH-1:0] n = {WIDTH{1'b0}};

有关复制运算符的完整描述,请参阅IEEE std 1800-2012 § 11.4.12.1 “复制运算符”

【讨论】:

  • 你也可以跳过复制,直接做wire [WIDTH-1:0] n = '0;将每一位分配给 0。
  • @nguthrie,填充零 ('0) 用于 SystemVerilog,SO 的问题用于 Verilog。
  • 您引用了 1800-2012 标准,所以我认为这是公平的游戏。在我看来,SV 只是 Verilog 的最新版本,所以即使人们没有用它标记他们的问题,也可能会听说 SV 语法。
  • 假设它是 1 后跟 n 个零?
  • @Floose 在 Verilog 中,只需将 1'b0 替换为您想要的任何值,例如将 1'b1 替换为全 1。 SV 具有填充值 '0,'1,'x,'z(不区分大小写)。
【解决方案2】:

扩展 Gregs 的答案并回答如果你想要 1 然后全是 0。

混合使用串联{a,b} 和复制{width{c}}

wire [WIDTH-1:0] n = { 1'b1, {WIDTH-1{1'b0}} } ;

在 SystemVerilog 中使用 '0'1 语法时,'b0 用于宽度匹配在旧版 Verilog 中有效。在 verilog-95 中,它最多只能匹配 32 位的宽度,但此后已被纠正。

在触发器上定义复位值的示例:

reg [7:0] a;
always @(posedge clk or negedge rst_n) begin
  if(~rst_n) begin
    a <= 'b0 ;
 ...

【讨论】:

  • 有没有办法分配任意值,比如 WIDTH'd345?
  • @Nazar 不,尽管您可以尝试使用全局刻度定义`define WIDTH 4,使用`WIDTH'd345
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多