C 将模块2的输出链接到模块1 VERILOG的if-else语句

C 将模块2的输出链接到模块1 VERILOG的if-else语句,c,verilog,xilinx,C,Verilog,Xilinx,我的目标是当我输入“开始=1”时,换档是无止境的,当我将其更改为“开始=0”时,换档停止 此时,当我的输出(result1=1)和(result=5)应该在$finish命令行结束。但它却以测试台上的$stop结尾 我认为问题在于第二个模块中的两个输出(result1和result2)在第一个模块中没有链接 如何将第二个模块中的输出链接到第一个模块,以便满足第一个模块中if else语句中的条件,并继续执行$finish 我预设了我的测试台代码,这样当start=0时;它在result1=1和r

我的目标是当我输入“开始=1”时,换档是无止境的,当我将其更改为“开始=0”时,换档停止

此时,当我的输出(result1=1)和(result=5)应该在$finish命令行结束。但它却以测试台上的$stop结尾

我认为问题在于第二个模块中的两个输出(result1和result2)在第一个模块中没有链接

如何将第二个模块中的输出链接到第一个模块,以便满足第一个模块中if else语句中的条件,并继续执行
$finish

我预设了我的测试台代码,这样当start=0时;它在result1=1和result2=5处停止

这是我的密码 //第一模块

module random(ps_in, ps_out, clk, start, result1, result2);

input      ps_in;
output reg ps_out;
input      clk;
input      start;

output [2:0] result1; //1st output based on the 2nd module
output [2:0] result2; //2nd output based on the 2nd module

reg count;

initial begin
  ps_out = 0;
  count  = 0;
end

always @ (posedge clk)
  if (start!=0) begin
    ps_out = ps_in;
  end
  else if (start!=1 && count!=1) begin
    ps_out = ps_in;
    count  = count + 1;
  end
  else if (start!=1 && result1==3'b001 && result2==3'b101) begin
    $finish; //IT MUST END IN THIS LINE
  end

endmodule



//2nd module


module smachine (start,clk,result1,result2);

input start;
input clk;

output [2:0] result1;
output [2:0] result2;

wire feedback1, feedback2, ffq1, ffq2, ffq3, ffq4;

random r1 (feedback1,  ffq1,          clk, start);
random r2 (ffq1,          result1[2], clk, start);
random r3 (result1[2], result1[1], clk, start);
random r4 (result1[1], result1[0], clk, start);
random r5 (result1[0], ffq2,       clk, start);

assign feedback1 = (result1[1] ^~ffq2);

random r6 (feedback2,  result2[2], clk, start);
random r7 (result2[2], result2[1], clk, start);
random r8 (result2[1], ffq3,       clk, start);
random r9 (ffq3,          result2[0], clk, start);
random r10(result2[0], ffq4,       clk, start);

assign feedback2 = (ffq3 ^~ffq4);

endmodule
这是我的测试台

module qqqq;

    // Inputs
    reg start;
    reg clk;

    // Outputs
    wire [2:0] result1;
    wire [2:0] result2;

    // Instantiate the Unit Under Test (UUT)
    smachine uut (
        .start(start), 
        .clk(clk), 
        .result1(result1), 
        .result2(result2)
    );

always
#5 clk = ~clk;

    initial begin
        // Initialize Inputs
        #10 start = 1;
        clk = 0;
        #50 start = 0;
        clk = 0;
        #50 $stop;
    end

    endmodule

阅读上面的问题可能有助于你的理解

在模块
random
result[12]中,输出:

output [2:0] result1; //1st output based on the 2nd module
output [2:0] result2; //2nd output based on the 2nd module
它们从未被赋值,因此条件
result1==3'b001&&result2==3'b101
永远不会为真

if (start!=1 && result1==3'b001 && result2==3'b101) begin
  $finish; //IT MUST END IN THIS LINE
end
这就是为什么它不会在
$finish
上退出

可能它们应该是输入?然后,您需要将值从模块
smachine
驱动到其中。目前,您只建立了4个连接,忽略了最后2个连接,即result和result2

您的测试台
模块QQ未实例化smachine,应为:

module tb;
  logic clk;
  logic start;
  logic [2:0] result1;
  logic [2:0] result2;

smachine DUT (
  .start (start), //Port connection
  .clk   (clk),   //Driving Signals to smachine instance DUT

  .result1 (result1),
  .result2 (result2)
);  

initial 
  forever
    #5 clk = ~clk;

 initial begin
   // Initialize Inputs
   #10 start = 1;
   clk = 0;
   #50 start = 0;
   clk = 0;
   #50 $stop; // BUT IT ENDS HERE
  end

endmodule
有关这方面的示例,请参见

添加注释中请求的示例以将输出捕获到不同的位置,这将迭代4个输出

reg [1:0] state = 2'b0; //state is a basic sounter

//Nextstate assignment
always @(posedge clk) begin
  state <= nextstate ;
end

//Next state logic
always @* begin //Combinatorial section
  nextstate = state+1 ;
end

// State Output
always @( posedge clk) begin
  case(state)
    2'd0 : output1 <= ps_out;
    2'd1 : output2 <= ps_out;
    2'd2 : output3 <= ps_out;
    2'd3 : output4 <= ps_out;
end
reg[1:0]状态=2'b0//国家是一个基本的出口国
//下一状态分配
始终@(posedge clk)开始

表示是,用于合成。。当它满足条件时,我正要放一个jackpot指示器,但我从$finish开始测试代码。。它就像一个轮盘赌游戏,“当输入“开始=1”时,转移是无止境的“转移发生在哪里?”?唯一的功能单元是递增计数
count=count+1。我假设随机模块中的结果[12]链接到smachine模块中的结果[12]。。我的测试台连接到模块smachine,因为该模块正在执行移位(随机)过程。。我可以用什么建议将smachine模块的结果[12]链接到random模块的结果[12]??thanks@JohnMichael你一直在说链接,但我不太清楚。其中一个模块必须创建该值。如果子模块接收到信号,则进行输入并连接端口。如果子模块创建了它,则将值从端口中移出并连接它。您在回答的最后一段中提到了未连接的端口。@JohnMichael没有自动链接,任何未实例化的模块都将成为顶级模块。您的tb应该真正实例化模块smachine,并且正确连接端口。有没有方法实例化这两个模块?我为我的无知道歉。。我只是verilog编码的新手,所以我试着一个接一个地理解它