debugging verilog加减器if错误

5cnsuln7  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(126)

错误代码:Add_sub.v(32):LHS在程序性连续赋值中可能不是一个网:有限公司
错误代码:Add_sub.v(34):LHS在程序性连续赋值中可能不是一个网:有限公司
我想写一个Verilog文件来实现一个带en选择的全加器-减法器(en == 0是加法器,en == 1是减法器)。我在全加器模块FA上遇到了困难,我试图写一个if语句来实现这一点。但是我遇到了上面的错误。下面是我的代码:

module Add_sub(x,y,co,u,en);
  input [3:0]x, y;
  input en;
  output [3:0]u;
  output co;

  wire [3:0]a;
  wire [3:1]c;

  xnor(a[0],x[0],en);
  xnor(a[1],x[1],en);
  xnor(a[2],x[2],en);
  xnor(a[3],x[3],en);

  reg co;

  FA M0(y[0],a[0],en,u[0],c[1]);
  FA M1(y[1],a[1],c[1],u[1],c[2]);
  FA M2(y[2],a[2],c[2],u[2],c[3]);
  FA M3(y[3],a[3],c[3],u[3],c[3]);

endmodule

module FA(x,y,cin,u,co,en);
  input x, y, cin, en;
  output u, co;

  assign u = x ^ y ^ cin;

always@(en, x, y, cin) begin
  if (en == 0)
  assign co = (x & y) | (x & cin) | (y & cin);
  if (en == 1)
  assign co = (!x & y) | (!x & cin) | (y & cin);
end

endmodule

有人能帮我吗?或者请提供我一些其他的方法,完全加减法器。

wkftcu5l

wkftcu5l1#

不要在always块中使用assign,并使变量在as always块中赋值,这样就可以修复FA模块。

module FA(x,y,cin,u,co,en);
  input x, y, cin, en;
  output reg u, co;

  assign u = x ^ y ^ cin;

always@(en, x, y, cin) begin
  if (en == 0)
    co = (x & y) | (x & cin) | (y & cin);
  if (en == 1)
    co = (!x & y) | (!x & cin) | (y & cin);
end

设计存在其他问题,FA模块有6个端口,FA示例有5个连接。
这个设计使用位置匹配来匹配示例名称和端口名称,但是第一个示例的位置是错误的。en信号在示例中位于列表的中间,而end信号在模块中位于列表的末尾。正因为如此,命名关联比位置关联更好。

相关问题