在设计愿景中详细阐述时出错
error when elaborating in design vision
我正在尝试用 verilog 编写代码并在设计愿景中对其进行综合,但是在详细阐述设计愿景时出现以下错误:
net "countS[5]" 由不止一个源驱动,并且至少有一个源是常数net
net "countS[4]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[3]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[2]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[1]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[0]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[5]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[4]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[3]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[2]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[1]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[0]" 由多个源驱动,并且至少有一个源是常量 net
我的代码在下面:
module main(clk,ts1,ts2,ts3,ts4,mode,res);
//clock of circuit
input clk;
//input switchs that indicate delays in test mode
input [3:0] ts1;
input [3:0] ts2;
input [3:0] ts3;
input [3:0] ts4;
//input switch that indicate mode of circuit
input [1:0] mode;
//output that indicate state of circuit
output reg [2:0] res;
//regs for counting
reg [5:0] countH;
reg [5:0] countS;
//array that indicate delays
reg [7:0] delays [3:0];
initial begin
//resetting circuit variables
countH = 0;
countS = 0;
res = 0;
//setting delays for regular mode
delays[0] = 30; //rg
delays[1] = 5; //ry
delays[2] = 45; //gr
delays[3] = 5; //yr
end
//trig always whenever mode was changed
always @(mode[0] or mode[1]) begin
//restarting timer
countH = 0;
countS = 0;
//mean that mode is regular
if(mode == 2'b00) begin
delays[0] = 30; //rg
delays[1] = 5; //ry
delays[2] = 45; //gr
delays[3] = 5; //yr
//mean that mode is test mode
end else if(mode == 2'b01) begin
//setting delays according to input switchs
delays[0] = ts1; //rg
delays[1] = ts2; //ry
delays[2] = ts3; //gr
delays[3] = ts4; //yr
//mean that mode is standby
end else begin
delays[0] = 0; //rg
delays[1] = 0; //ry
delays[2] = 0; //gr
delays[3] = 0; //yr
res = 4;
end
end
//trig in all clocks
always @(negedge clk) begin
countH = countH + 1;
//count=60 mean 1sec
if(countH == 60) begin
//updating variables
countH = 0;
countS = countS + 1;
//mean that mode is standby
if(mode == 2) begin
res = 4;
countS = 0;
//mean that mode is regular or test
end else begin
//checking for delay
if(countS == delays[res]) begin
countS = 0;
res = res + 1;
if(res == 4) begin
res = 0;
end
end
end
end
end
endmodule
错误是由综合工具生成的,因为综合试图将用 Verilog 编写的设计转换为硬件,但在转换过程中它发现电线 countS
(和其他)是从多个位置驱动的.
这些位置是分配电线的 initial
和 always
块。可以把它想象成使用离散门进行设计;在这种情况下,如果多个驱动相同的电线也会导致问题。
所以需要修改设计,所以每个wire/reg只驱动一个always
块或者连续赋值,其中initial
块大概是要转换成一些异步或同步重置,或像 reg [5:0] countS := 0;
.
这样的初始值
我正在尝试用 verilog 编写代码并在设计愿景中对其进行综合,但是在详细阐述设计愿景时出现以下错误:
net "countS[5]" 由不止一个源驱动,并且至少有一个源是常数net
net "countS[4]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[3]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[2]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[1]" 由多个源驱动,并且至少有一个源是常量 net
net "countS[0]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[5]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[4]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[3]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[2]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[1]" 由多个源驱动,并且至少有一个源是常量 net
net "countH[0]" 由多个源驱动,并且至少有一个源是常量 net
我的代码在下面:
module main(clk,ts1,ts2,ts3,ts4,mode,res);
//clock of circuit
input clk;
//input switchs that indicate delays in test mode
input [3:0] ts1;
input [3:0] ts2;
input [3:0] ts3;
input [3:0] ts4;
//input switch that indicate mode of circuit
input [1:0] mode;
//output that indicate state of circuit
output reg [2:0] res;
//regs for counting
reg [5:0] countH;
reg [5:0] countS;
//array that indicate delays
reg [7:0] delays [3:0];
initial begin
//resetting circuit variables
countH = 0;
countS = 0;
res = 0;
//setting delays for regular mode
delays[0] = 30; //rg
delays[1] = 5; //ry
delays[2] = 45; //gr
delays[3] = 5; //yr
end
//trig always whenever mode was changed
always @(mode[0] or mode[1]) begin
//restarting timer
countH = 0;
countS = 0;
//mean that mode is regular
if(mode == 2'b00) begin
delays[0] = 30; //rg
delays[1] = 5; //ry
delays[2] = 45; //gr
delays[3] = 5; //yr
//mean that mode is test mode
end else if(mode == 2'b01) begin
//setting delays according to input switchs
delays[0] = ts1; //rg
delays[1] = ts2; //ry
delays[2] = ts3; //gr
delays[3] = ts4; //yr
//mean that mode is standby
end else begin
delays[0] = 0; //rg
delays[1] = 0; //ry
delays[2] = 0; //gr
delays[3] = 0; //yr
res = 4;
end
end
//trig in all clocks
always @(negedge clk) begin
countH = countH + 1;
//count=60 mean 1sec
if(countH == 60) begin
//updating variables
countH = 0;
countS = countS + 1;
//mean that mode is standby
if(mode == 2) begin
res = 4;
countS = 0;
//mean that mode is regular or test
end else begin
//checking for delay
if(countS == delays[res]) begin
countS = 0;
res = res + 1;
if(res == 4) begin
res = 0;
end
end
end
end
end
endmodule
错误是由综合工具生成的,因为综合试图将用 Verilog 编写的设计转换为硬件,但在转换过程中它发现电线 countS
(和其他)是从多个位置驱动的.
这些位置是分配电线的 initial
和 always
块。可以把它想象成使用离散门进行设计;在这种情况下,如果多个驱动相同的电线也会导致问题。
所以需要修改设计,所以每个wire/reg只驱动一个always
块或者连续赋值,其中initial
块大概是要转换成一些异步或同步重置,或像 reg [5:0] countS := 0;
.