2012-10-31 69 views
4

我一直在试图建立一个返回(3位)输入的二进制补码表示(第一位是符号)的模块。我认为下面的代码是正确的概念,但我可能失去了一些东西它的结构:当我尝试编译,我得到以下错误:Verilog中的二进制补码

(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 

回答

2

在Verilog中,未声明的标识符在大多数情况下被认为是隐含的导线声明。由于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; 
+0

非常感谢你......这种“小”的东西,我不能把它放在手指上! – Ironil

1

f_o需要声明为reg。 output 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 

你可能会处理的编码输入,但twos_complement是否定我希望符号位(MSB)更改号码。虽然我们将它称为符号位,但它也包含有关该值的信息,因此不能只是被剥离并保持不变。

+0

也谢谢你,问题的解决方法与Adam12相同。关于你的其他评论,基本上我所做的就是如果输入是正数,则数字保持不变,如果输入是负数,则改为ca2表示(即:如果输入为101,则意味着-3,ca2为011) 。我不知道我是否对这个例子很有意义,但无论如何,代码都会做我所需要的。 – Ironil

+0

嗯,这是转换符号(MSB)幅度(LSBs)为Twos补码。 – Morgan