如何更改代码。非恢复分频器verilog testbench代码

时间:2016-11-29 04:36:19

标签: verilog hdl

我为加法器设计但结果是错误的。

module div(x,y,quotient,remainder);

parameter M=4;
parameter N=4;

input [M-1:0] x;
input [N-1:0] y;

output [N-1:0] quotient;
output [M-1:0] remainder;
wire [M-1:0] rem_carry;

wire sum[M-1:0][N-1:0];
wire carry[M-1:0][N-1:0];
genvar i, j;
generate for(i=N-1; i>=0; i=i-1) begin:
unsigned_divider

if(i==N-1)
for(j=0; j<M; j=j+1) begin: first_row
if(j==0)
assign {carry[j][i],sum[j][i]}=y[i]+!x[j]+1;
assign {carry[j][i],sum[j][i]}=!x[j]+carry[j-1][i];
end
else
for(j=0; j<M;j=j+1) begin:rest_rows
if(j==0)
assign{carry[j][i],sum[j][i]}=y[i]+(x[j]^carry[M-1][i+1])+carry[M-1][i+1];
else
assign {carry[j][i],sum[j][i]}=sum[j-1][i+1]+(x[j]^carry[M-1][i+1])+carry[j-1][i];
end
end endgenerate

generate for(i=0; i<N; i=i+1)
begin:product_quotient
assign quotient[i]=carry[M-1][i];
end endgenerate

generate for(j=0;j<M;j=j+1)
begin:remainder_adjust
if(j==0)
assign{rem_carry[j],remainder[j]} = sum[j][0]+(sum[M-1][0]&x[j]);
else
assign{rem_carry[j],remainder[j]} =sum[j][0]+(sum[M-1][0]&x[j])+rem_carry[j-1];
end endgenerate
endmodule

和testbench模拟代码

module tb_div();

parameter M = 4; // default divisor width
parameter N = 4; // default dividend width

reg [M-1:0] x;
reg [N-1:0] y;
wire[N-1:0] quotient;
wire[M-1:0] remainder;
wire[M-1:0] rem_carry;

div U0(.x(x), .y(y), .quotient(quotient), .remainder(remainder));

initial begin


    x = 0;  y = 0; 
    // Wait 100 ns for global reset to finish
    #100;

    // Add stimulus here
    x=4'b0001;y=4'b0000;
    #300 x=4'b0100;y=4'b0011;
    #300 x=4'b1101;y=4'b1010;
    #300 x=4'b1110;y=4'b1001;
    #300 x=4'b1111;y=4'b1010;

end

endmodule 

enter image description here

但商,rmainder,rem_carry不是值。

如何更改代码?我认为testbench就是问题所在。请告诉我。

1 个答案:

答案 0 :(得分:0)

quotientremainder上的X值归因于设计中的carrysum上的争用。更改:

assign {carry[j][i],sum[j][i]}=!x[j]+carry[j-1][i];

收件人:

else assign {carry[j][i],sum[j][i]}=!x[j]+carry[j-1][i];

缺少的else导致carry由2条assign语句同时驱动。 sum也是如此。我的模拟器在该行上给了我“超出声明范围的部分选择索引”的编译警告。适当的缩进可以使发现此错误更加容易。


您会在测试台的rem_carry信号上看到Z,因为该信号是未驱动的。您需要向output模块添加一个div端口,并在测试平台中进行正确的连接。