C 将模块2的输出链接到模块1 VERILOG的if-else语句
我的目标是当我输入“开始=1”时,换档是无止境的,当我将其更改为“开始=0”时,换档停止 此时,当我的输出(result1=1)和(result=5)应该在$finish命令行结束。但它却以测试台上的$stop结尾 我认为问题在于第二个模块中的两个输出(result1和result2)在第一个模块中没有链接 如何将第二个模块中的输出链接到第一个模块,以便满足第一个模块中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
$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编码的新手,所以我试着一个接一个地理解它