【问题标题】:How do I invert a 64-bit variable in verilog?如何在verilog中反转64位变量?
【发布时间】:2021-12-09 17:29:34
【问题描述】:

我试图在 verilog 中反转一个 64 位变量,但由于某种原因,只有一位反转了。

wire [63:0] bc;
assign bc = 64'b0;
assign notbc = ~bc;

我希望输出为 64 位,但我得到的最高有效位为 1,其他位为 0。 我还尝试了我在网上找到的其他东西:

assign notbc = bc ^ 64'b1;

但这次我得到的是最低有效位是 1,其他位是 0。我能做些什么来否定每一位,即 1 的 64 位? 注意:我仅限于 Verilog,无法使用 SystemVerilog。

这是完整的模块:

`timescale 1ns/1ns

module notting(
output [63:0] out);

wire [63:0] bc;
assign bc = 64'b0;
assign out = ~bc;

endmodule

【问题讨论】:

标签: verilog


【解决方案1】:

您粘贴的代码中可能缺少它,但由于未声明 notbc,它将被隐式声明为一位线。使用以下代码,您应该得到 64 个,除非您的模拟器有问题:

wire [63:0] bc, notbc;
assign bc = 64'b0;
assign notbc = ~bc;

【讨论】:

  • notbc 被声明为 64 位输出,我只是忘记在此处将其添加到代码 sn-p 中。这意味着模拟器一定有问题?
  • 您使用的是哪个模拟器?老实说,如果模拟器中存在这样简单的错误,我会感到惊讶。您是否有可能从其他地方驱动相同的信号? (例如,第二个分配语句?)
  • 我正在使用在线平台 (cloudv.io)。我尝试了两件事:在模块内部分配 bc ,就像在粘贴的示例中一样,还尝试将其声明为输入并在测试平台模块中为其赋予值 0(64 位 0)。两者都不起作用。
  • 我继续注册了该服务,并且能够重现您看到的问题。像@dave_59 一样,我还使用几个商业模拟器测试了您的代码,它按预期工作,所以我确信这是他们模拟器中的一个错误。这是相当令人担忧的——我不会依赖具有如此基本缺陷的模拟器。有趣的是,它们还提供了一个综合选项,它为您的代码生成以下网表实现:assign out = 64'hffffffffffffffff;
【解决方案2】:

我在 cloudv.io 中检查了您的代码。 我已经检查过它适用于小位宽 但是,当我增加位宽时,错误就出现了。 在这一点上,我不确定是什么导致了这个错误,因为我对系统不友好。 当输入超过 50 位宽时,似乎可以重现该错误。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多