两个';verilog中的s补码

两个';verilog中的s补码,verilog,Verilog,我一直在尝试构建一个模块,它返回(3位)输入的两个补码表示(第一位是符号)。我认为下面的代码在概念上是正确的,但我可能遗漏了它的结构:当我尝试编译时,我会出现以下错误: (vlog-2110) Illegal reference to net "f_o". (vlog-2110) Illegal reference to net "f_o". (vlog-2110) Illegal reference to net "f_o". 搜索该错误表明,当同时使用变量作为输入和输出时,通常会看到该错误

我一直在尝试构建一个模块,它返回(3位)输入的两个补码表示(第一位是符号)。我认为下面的代码在概念上是正确的,但我可能遗漏了它的结构:当我尝试编译时,我会出现以下错误:

(vlog-2110) Illegal reference to net "f_o".
(vlog-2110) Illegal reference to net "f_o".
(vlog-2110) Illegal reference to net "f_o".
搜索该错误表明,当同时使用变量作为输入和输出时,通常会看到该错误,但我的情况并非如此。你能指出错误在哪里吗

module ca2 (a_i,f_o);
  input  [2:0] a_i;
  output [2:0] f_o;

  always @(a_i[2:0] or f_o[2:0])
  begin
    if (a_i[2] == 1)
    begin
      f_o[2]   = a_i[2];
      f_o[1:0] = (~a_i[1:0] + 'b1);
    end
    else
    begin
      f_o = a_i;
    end
  end
endmodule

在Verilog中,在大多数情况下,未声明的标识符被认为是隐式的wire声明。由于f_o尚未声明,编译器将其视为一个连接,而不是一个变量。这会导致编译器抱怨所有赋值

// What was typed
module ca2 (a_i,f_o);
  input  [2:0] a_i;
  output [2:0] f_o;

// What the compiler implicitly declares
  wire   [2:0] a_i;
  wire   [2:0] f_o;
要修复它,您可以声明变量或同时声明端口和变量

module ca2 (a_i,f_o);
  input  [2:0] a_i;
  output [2:0] f_o; 
  reg [2:0] f_o;

module ca2 (a_i,f_o);
  input      [2:0] a_i;
  output reg [2:0] f_o; 

f_o
需要声明为reg<代码>输出注册表[2:0]f_o

我也不知道你在计算什么,这不是标准的二补

module ca2 (
  input      [2:0] a_i,
  output     [2:0] twos_comp,
  output     [2:0] also_twos_comp
);

  assign      twos_comp = ~a_i + 1'b1;
  assign also_twos_comp = -a_i ;
endmodule

您可能正在处理一个编码输入,但Two S_补码是对我期望符号位(MSB)改变的数字求反。虽然我们将其称为符号位,但它也包含有关值的信息,因此不能将其去掉,保持数字不变。

非常感谢。。。一些如此“小”的东西,我无法用手指触摸它!也谢谢,问题的解决方案与Adam12相同。关于你的其他评论,基本上我所做的是,如果输入为正,则保持数字不变,如果输入为负,则更改为ca2表示法(即:如果输入为101,则表示-3,ca2为011)。我不知道这个例子是否有意义,但在任何情况下,代码都满足了我的需要。啊,这就是将符号(MSB)大小(LSB)转换为两个补码。