如何修复不恢复分界线输出中的X?

问题描述 投票:1回答:1

我做了一个分频器的设计,但结果是错误的。

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

和测试台仿真代码

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

但是.., quotient, remainder, rem_carry 是不值。

如何修改代码?我觉得是testbench的问题。

verilog hdl
1个回答
0
投票

X值在 quotientremainder 是由于争论 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. 我的模拟器在这一行给了我一个 "part-select index out of declared bounds "的编译警告。 适当的缩进会让你更容易发现这个错误。


你在 rem_carry 因为该信号未被驱动。 您需要在测试平台中添加一个 output 埠到 div 模块,并在测试台中进行适当的连接。

© www.soinside.com 2019 - 2024. All rights reserved.