0

(已编辑)我正在研究 verilog 算术项目,但我被卡在了符号扩展部分(假设这是问题所在)。我有 4 位输入 A、B,应该有 8 位输出。对于某些过程(总和,子...),我需要使用符号扩展来制作 8 位输出。所以对于算术的主体,我有这个代码。这是代码的一半。我没有包括一半因为它只是长..

module arithmetic(A, B, AN0, DP, sum, sub, mult, div, comp, shiftLeft, 
shiftRight, signExtend);

   input signed [3:0] A, B;

   output [7:0] sum, sub, mult, div, comp, shiftLeft, shiftRight, 
   signExtend;

   output AN0, DP;

   //sum
   reg [4:0] qsum;   
   always@ (A, B)
      qsum = A+B;

   assign sum = {{3{qsum[4]}},qsum};

   //sub
   reg [4:0] qsub;

   always@ (A, B)
      qsub = A-B;

   assign sub = {{3{qsub[4]}},qsub};

   //mult
   reg [7:0] qmult;
   always@ (A, B)
      qmult = A * B;

   assign mult = qmult;

当我检查我的模拟时,它除了 Z 和 Xs 之外没有任何值。它甚至不显示任何输入值。为什么会这样??谢谢你

(已编辑)这是我的测试台代码。有 8 种操作(求和、减法、乘法、除法、比较器、左移、右移、符号扩展)

module lap3_top_tb();
reg signed [3:0] A, B;
reg [2:0] Operation;
wire [7:0] Result;
wire DP, AN0;

lab3_top ulap3_top(
  .A(A),
  .B(B),
  .Operation(Operation),
  .Result(Result),
  .DP(DP),
  .AN0(AN0)
);

initial begin
   A = 6; B = 7; Operation = 0;
   #20;
   A = -6; B = -7; Operation = 0;
   #20;      
   A = 6; B = 7; Operation = 1;
   #20;
   A = -6; B = -7; Operation = 1;
   #20;
   A = 6; B = 7; Operation = 2;
   #20;
   A = -6; B = 7; Operation = 2;
   #20;
   A = 7; B = 4; Operation = 3;
   #20;
   A = 7; B = 0; Operation = 3;
   #20;
   A = 6; B = 7; Operation = 4;
   #20;
   A = -6; B = -7; Operation = 4;
   #20;
   A = 1; B = 6; Operation = 5;
   #20;
   A = 1; B = -6; Operation = 5;
   #20;
   A = 1; B = 6; Operation = 6;
   #20;
   A = 1; B = -6; Operation = 6;
   #20;
   A = 6; B = 0; Operation = 7;
   #20;
   A = -5; B = 0; Operation = 7;
   #20;
end

endmodule

lap3_top 文件在这里。(mux_8_1 将选择输出并通过结果输出。如果您需要代码,请告诉我!但我认为 mux 工作正常)

module lap3_top(A, B, Operation, Result, AN0, DP);
   input signed [3:0] A, B;
   input [2:0] Operation;
   output AN0, DP;

   output [7:0] Result;
   wire a, b, c, d, e, f, g, h;

   arithmetic uarithmetic(
   .A(A), 
   .B(B), 
   .AN0(AN0), 
   .DP(DP), 
   .sum(a), 
   .sub(b), 
   .mult(c), 
   .div(d), 
   .comp(e), 
   .shiftLeft(f), 
   .shiftRight(g), 
   .signExtend(h)
   );

   mux_8_1 umux8_1(
   .A(a), 
   .B(b), 
   .C(c), 
   .D(d), 
   .E(e), 
   .F(f), 
   .G(g), 
   .H(h), 
   .Operation(Operation), 
   .Result(Result)
   );

endmodule

十分感谢大家!

4

1 回答 1

0

我尝试模拟您的代码并在您的代码中发现以下错误:当您在 testbench 模块中实例化 top 模块时,您使用模块的lab3_top ulap3_top(...);la b 3_top 名称,但是您希望使用另一个名称module lap3_top(...);la p 3_top 的模块。

我改了名字,一切正常(在波形上你可以看到ZZ状态,因为我在代码中没有mux_8_1模块,很少有操作没有描述)在此处输入图像描述

PS 顺便说一句,我假设您在添加此标签时使用了 Vivado。如果是这样,有一个提示如何检查这样的错误(在模块和实例化中使用不同的名称,或者当模块中有一些错误无法在库中编译时)。如果您在层次结构中展开所有模块,您会发现?错误所在的登录模块。在此处输入图像描述

于 2017-04-15T02:20:15.300 回答