mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-07 09:55:20 +00:00
This makes tests/verilog/dynamic_range_lhs.v pass, after ensuring that nowrshmsk is actually tested. Stride is extracted from indexing of two-dimensional packed arrays and variable slices on the form dst[i*stride +: width] = src, and is used to optimize the generated CASE block. Also uses less confusing variable names for indexing of lhs wires.
77 lines
1.8 KiB
Verilog
77 lines
1.8 KiB
Verilog
module gate(
|
|
(* nowrshmsk = `ALT *)
|
|
output reg [`LEFT:`RIGHT] out_u, out_s,
|
|
input wire data,
|
|
input wire [1:0] sel1, sel2
|
|
);
|
|
always @* begin
|
|
out_u = 0;
|
|
out_s = 0;
|
|
case (`SPAN)
|
|
1: begin
|
|
out_u[sel1*sel2] = data;
|
|
out_s[$signed(sel1*sel2)] = data;
|
|
end
|
|
2: begin
|
|
out_u[sel1*sel2+:2] = {data, data};
|
|
out_s[$signed(sel1*sel2)+:2] = {data, data};
|
|
end
|
|
3: begin
|
|
out_u[sel1*sel2+:3] = {data, data, data};
|
|
out_s[$signed(sel1*sel2)+:3] = {data, data, data};
|
|
end
|
|
4: begin
|
|
out_u[sel1*sel2+:4] = {data, data, data, data};
|
|
out_s[$signed(sel1*sel2)+:4] = {data, data, data, data};
|
|
end
|
|
endcase
|
|
end
|
|
endmodule
|
|
|
|
module gold(
|
|
output reg [`LEFT:`RIGHT] out_u, out_s,
|
|
input wire data,
|
|
input wire [1:0] sel1, sel2
|
|
);
|
|
task set;
|
|
input integer a, b;
|
|
localparam LOW = `LEFT > `RIGHT ? `RIGHT : `LEFT;
|
|
localparam HIGH = `LEFT > `RIGHT ? `LEFT : `RIGHT;
|
|
if (LOW <= a && a <= HIGH)
|
|
out_u[a] = data;
|
|
if (LOW <= b && b <= HIGH)
|
|
out_s[b] = data;
|
|
endtask
|
|
always @* begin
|
|
out_u = 0;
|
|
out_s = 0;
|
|
case (sel1*sel2)
|
|
2'b00: set(0, 0);
|
|
2'b01: set(1, 1);
|
|
2'b10: set(2, -2);
|
|
2'b11: set(3, -1);
|
|
endcase
|
|
if (`SPAN >= 2)
|
|
case (sel1*sel2)
|
|
2'b00: set(1, 1);
|
|
2'b01: set(2, 2);
|
|
2'b10: set(3, -1);
|
|
2'b11: set(4, 0);
|
|
endcase
|
|
if (`SPAN >= 3)
|
|
case (sel1*sel2)
|
|
2'b00: set(2, 2);
|
|
2'b01: set(3, 3);
|
|
2'b10: set(4, 0);
|
|
2'b11: set(5, 1);
|
|
endcase
|
|
if (`SPAN >= 4)
|
|
case (sel1*sel2)
|
|
2'b00: set(3, 3);
|
|
2'b01: set(4, 4);
|
|
2'b10: set(5, 1);
|
|
2'b11: set(6, 2);
|
|
endcase
|
|
end
|
|
endmodule
|