mirror of
https://github.com/YosysHQ/yosys
synced 2025-08-19 17:50:26 +00:00
Extend "delay" expressions to handle pair and triplet, i.e. rise, fall and turn-off (#2566)
This commit is contained in:
parent
fffbf651df
commit
dcd9f0af23
3 changed files with 445 additions and 2 deletions
213
tests/verilog/delay_mintypmax.ys
Normal file
213
tests/verilog/delay_mintypmax.ys
Normal file
|
@ -0,0 +1,213 @@
|
|||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test (a, b, c, y);
|
||||
input a;
|
||||
input signed [1:0] b;
|
||||
input signed [2:0] c;
|
||||
output y;
|
||||
assign #(12.5 : 14.5 : 20) y = ^(a ? b : c);
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog << EOT
|
||||
module test (input [7:0] a, b, c, d, output [7:0] x, y, z);
|
||||
assign #(20:20:25) x = a + b, y = b + c, z = c + d;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog << EOT
|
||||
module test (input [7:0] a, b, c, d, output [7:0] x, y, z);
|
||||
assign #(20:20:25, 40:45:50, 60:65:75) x = a + b, y = b + c, z = c + d;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test (a, b, c, y);
|
||||
localparam TIME_STEP = 0.011;
|
||||
input signed [3:0] a;
|
||||
input signed [1:0] b;
|
||||
input signed [1:0] c;
|
||||
output [5:0] y;
|
||||
assign #(TIME_STEP:TIME_STEP:TIME_STEP) y = (a >> b) >>> c;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test;
|
||||
wire o, a, b;
|
||||
and #(1:2:3, 4:5:6) and_gate (o, a, b);
|
||||
wire #(1:2:3, 4:5:6, 7:8:9) x;
|
||||
assign o = x;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test;
|
||||
localparam TIME_TYP = 0.7;
|
||||
wire o, a, b;
|
||||
and #(0:TIME_TYP:2) and_gate (o, a, b);
|
||||
wire #(2:TIME_TYP:4) x;
|
||||
assign o = x;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect warning "Yosys has only limited support for tri-state logic at the moment." 1
|
||||
read_verilog <<EOT
|
||||
module test (input en, input a, input b, output c);
|
||||
wire [15:0] add0_res = a + b;
|
||||
assign #(15:20:30) c = (en) ? a : 1'bz;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test (input en, d, t_min, t, t_max);
|
||||
reg o;
|
||||
always @*
|
||||
if (en)
|
||||
o = #(t_min : t : t_max, t_min : t : t_max) ~d;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test #(parameter DELAY_RISE = 0, DELAY_FALL = 0, DELAY_Z = 0)
|
||||
(input clock, input reset, input req_0, input req_1, output gnt_0, output gnt_1);
|
||||
parameter SIZE = 3;
|
||||
parameter IDLE = 3'b001, GNT0 = 3'b010, GNT1 = 3'b100;
|
||||
reg [SIZE-1:0] state;
|
||||
reg [SIZE-1:0] next_state;
|
||||
reg gnt_0, gnt_1;
|
||||
|
||||
always @ (state or req_0 or req_1)
|
||||
begin : FSM_COMBO
|
||||
next_state = 3'b000;
|
||||
case (state)
|
||||
IDLE : if (req_0 == 1'b1) begin
|
||||
next_state = #(DELAY_RISE-1 : DELAY_RISE : DELAY_RISE+1) GNT0;
|
||||
end else if (req_1 == 1'b1) begin
|
||||
next_state = #(DELAY_FALL/1.2 : DELAY_FALL : DELAY_FALL*2.5) GNT1;
|
||||
end else begin
|
||||
next_state = #(DELAY_Z : DELAY_Z : DELAY_Z) IDLE;
|
||||
end
|
||||
GNT0 : if (req_0 == 1'b1) begin
|
||||
#(DELAY_RISE : DELAY_RISE : DELAY_FALL) next_state = GNT0;
|
||||
end else begin
|
||||
#DELAY_RISE next_state = IDLE;
|
||||
end
|
||||
GNT1 : if (req_1 == 1'b1) begin
|
||||
#10 next_state = GNT1;
|
||||
end else begin
|
||||
#(10:10:15, 20:25:25) next_state = IDLE;
|
||||
end
|
||||
default : next_state = IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
always @ (posedge clock)
|
||||
begin : FSM_SEQ
|
||||
if (reset == 1'b1) begin
|
||||
#(10:10:15) state <= IDLE;
|
||||
end else begin
|
||||
#(10) state <= next_state;
|
||||
end
|
||||
end
|
||||
|
||||
always @ (posedge clock)
|
||||
begin : FSM_OUTPUT
|
||||
if (reset == 1'b1) begin
|
||||
gnt_0 <= #(8:9:10) 1'b0;
|
||||
gnt_1 <= #1 1'b0;
|
||||
end else begin
|
||||
case (state)
|
||||
IDLE : begin
|
||||
gnt_0 <= #(8:9:10) 1'b0;
|
||||
gnt_1 <= #1 1'b0;
|
||||
end
|
||||
GNT0 : begin
|
||||
gnt_0 <= #(4:5:6,8:9:10) 1'b1;
|
||||
gnt_1 <= #1 1'b0;
|
||||
end
|
||||
GNT1 : begin
|
||||
gnt_0 <= #(2:3:4,4:5:6,8:9:10) 1'b0;
|
||||
gnt_1 <= #1 1'b1;
|
||||
end
|
||||
default : begin
|
||||
gnt_0 <= 1'b0;
|
||||
gnt_1 <= 1'b0;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test;
|
||||
reg q;
|
||||
initial begin
|
||||
q = 1;
|
||||
#(1:2:2) q = 0;
|
||||
end
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test #(parameter hyst = 16)
|
||||
(input [0:1] inA, input rst, output reg out);
|
||||
parameter real updatePeriod = 100.0;
|
||||
initial out = 1'b0;
|
||||
always #(updatePeriod-5:updatePeriod:updatePeriod+5) begin
|
||||
if (rst) out <= 1'b0;
|
||||
else if (inA[0] > inA[1]) out <= 1'b1;
|
||||
else if (inA[0] < inA[1] - hyst) out <= 1'b0;
|
||||
end
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test;
|
||||
reg clk;
|
||||
initial clk = 1'b0;
|
||||
always #(100:180:230) clk = ~clk;
|
||||
endmodule
|
||||
EOT
|
||||
|
||||
design -reset
|
||||
logger -expect-no-warnings
|
||||
read_verilog <<EOT
|
||||
module test;
|
||||
reg clk;
|
||||
initial clk = 1'b0;
|
||||
always clk = #(100:180:230, 100:180:230) ~clk;
|
||||
task t_test;
|
||||
sig_036_A <= #(2, 4, 5.5) 0;
|
||||
sig_036_B <= #(1.3, 3) 0;
|
||||
sig_036_S <= #(2) 0;
|
||||
#(100 : 200 : 300, 400 : 500 : 600, 700 : 800 : 900);
|
||||
sig_036_A <= #(1.5:2.5:3.0, 3:4:5, 7) ~0;
|
||||
sig_036_B <= #(2, 4:6:6) ~0;
|
||||
sig_036_S <= #(1.5:2.5:3.0) ~0;
|
||||
#100;
|
||||
endtask
|
||||
endmodule
|
||||
EOT
|
Loading…
Add table
Add a link
Reference in a new issue