Verilog 计算平方根

Verilog 计算平方根,verilog,computer-architecture,system-verilog,Verilog,Computer Architecture,System Verilog,我编写代码来计算数字的完美平方,但没有得到正确的输出。我接受输入b和regsa,d。首先,我将1放在d中,然后将其平方并存储在a中。然后与输入进行比较-如果不满足,则增加d。但我得到的输出是square=XXXX 我的代码: module square_root(b,clk,square); input [3:0] b; input clk; output [3:0]square; reg[3:0]a,square; reg[2:0] d; initial begin d<

我编写代码来计算数字的完美平方,但没有得到正确的输出。我接受输入
b
和regs
a
d
。首先,我将
1
放在
d
中,然后将其平方并存储在
a
中。然后与输入进行比较-如果不满足,则增加
d
。但我得到的输出是
square=XXXX

我的代码:

module square_root(b,clk,square);

input [3:0] b;
input clk;
output [3:0]square;
reg[3:0]a,square;
reg[2:0] d;

initial
  begin
    d<=3'b001;
  end

always@(clk)
  begin
    a<=d*d;
    if(a==b)
      square<=a;
    else
      d<=d+1;
  end
endmodule
模块平方根(b,clk,square);
输入[3:0]b;
输入时钟;
输出[3:0]平方;
reg[3:0]a,正方形;
reg[2:0]d;
最初的
开始
D
可能不是最好的代码…但是嘿

改变这个

initial
begin
  d<=3'b001;
end
试验台:

module TB_Sqrt;
  reg clk;
  reg [3:0]in;
  wire [3:0]out;

  Sqrt SQRT(clk,in,out);

  initial
  begin
    clk=0;
    in=9;
  end

  always
  #2 clk=!clk;

endmodule
module TB_SQT;
  reg [3:0]b;
  reg clk;
  wire [3:0]square;

  square_root SQT(b,clk,square);

  initial
  begin
    clk=0;
    b=9;
  end

  always
  #1 clk=!clk;

endmodule

你丢失了一个重置信号。@Tudor是的……我知道……但我刚刚指出了操作代码中的错误你丢失了一个重置信号。在现实生活中,语句
reg[3:0]temp=1
没有任何意义。该赋值将被合成工具忽略。@Tudor我认为这是写入FPGA初始值的一种可接受的方式。您的ASIC正确,它将被忽略。@Morgan我不知道。不过,如果没有重置信号,你就无法真正回到初始状态(我想除了拔掉设备插头之外),因此没有重置信号的用处是相当有限的。@Tudor,我同意,我想在大多数设置中,电源循环是用来重置的。我的理解是,异步重置在fpga设备上非常昂贵(不是那么常见)。尽管可以使用同步休息。使事情复杂化的建议和用法因供应商而异。@Tudor是的,这很明显。我只是猛击了一下,以显示OP.reg[3:0]temp=1是完全正常的。您丢失了
d
的重置信号。除非您使用已知值初始化触发器,否则将得到
X
s。我假设
a
看起来正常,那么您永远不会满足设置平方的条件
a==b
。注意:如果没有完整的标志,您如何知道已计算出结果,如果正在计算平方根,您需要
square
initial
begin
  d=3'b001;
end
module TB_SQT;
  reg [3:0]b;
  reg clk;
  wire [3:0]square;

  square_root SQT(b,clk,square);

  initial
  begin
    clk=0;
    b=9;
  end

  always
  #1 clk=!clk;

endmodule