mirror of
https://github.com/zachjs/sv2v.git
synced 2026-09-01 10:06:19 +02:00
conversion for implicitly variably sized parameters
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
module top;
|
||||
parameter FOO = "some useful string";
|
||||
localparam FOO = "some useful string";
|
||||
localparam type T = type(FOO);
|
||||
localparam T BAR = "some other useful string";
|
||||
initial $display("'%s' '%s'", FOO, BAR);
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
module top;
|
||||
parameter FOO = "some useful string";
|
||||
localparam FOO = "some useful string";
|
||||
localparam BAR = "some other useful string";
|
||||
initial $display("'%s' '%s'", FOO, BAR);
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
`include "string_param.vh"
|
||||
|
||||
module Example(inp, out);
|
||||
parameter PATTERN = "whatever";
|
||||
parameter UNUSED = 0;
|
||||
localparam IN_WIDTH = $bits(PATTERN);
|
||||
localparam OUT_WIDTH = `COUNT_ONES(PATTERN);
|
||||
|
||||
input [IN_WIDTH - 1:0] inp;
|
||||
output [OUT_WIDTH - 1:0] out;
|
||||
if (PATTERN[0])
|
||||
assign out[0] = inp[0];
|
||||
for (genvar j = 1; j < IN_WIDTH; ++j)
|
||||
if (PATTERN[j])
|
||||
assign out[`COUNT_ONES(PATTERN[j - 1:0])] = inp[j];
|
||||
endmodule
|
||||
@@ -0,0 +1,16 @@
|
||||
`include "string_param.vh"
|
||||
|
||||
module Example(inp, out);
|
||||
parameter PATTERN = "whatever";
|
||||
parameter IN_WIDTH = $bits(PATTERN);
|
||||
localparam OUT_WIDTH = `COUNT_ONES(PATTERN);
|
||||
|
||||
input wire [IN_WIDTH - 1:0] inp;
|
||||
output wire [OUT_WIDTH - 1:0] out;
|
||||
if (PATTERN[0])
|
||||
assign out[0] = inp[0];
|
||||
genvar j;
|
||||
for (j = 1; j < IN_WIDTH; j = j + 1)
|
||||
if (PATTERN[j])
|
||||
assign out[`COUNT_ONES(PATTERN[j - 1:0])] = inp[j];
|
||||
endmodule
|
||||
@@ -0,0 +1,33 @@
|
||||
`define COUNT_ONES(expr) (0 \
|
||||
+ ((expr) >> 0 & 1'b1) + ((expr) >> 1 & 1'b1) + ((expr) >> 2 & 1'b1) + ((expr) >> 3 & 1'b1) \
|
||||
+ ((expr) >> 4 & 1'b1) + ((expr) >> 5 & 1'b1) + ((expr) >> 6 & 1'b1) + ((expr) >> 7 & 1'b1) \
|
||||
+ ((expr) >> 8 & 1'b1) + ((expr) >> 9 & 1'b1) + ((expr) >> 10 & 1'b1) + ((expr) >> 11 & 1'b1) \
|
||||
+ ((expr) >> 12 & 1'b1) + ((expr) >> 13 & 1'b1) + ((expr) >> 14 & 1'b1) + ((expr) >> 15 & 1'b1) \
|
||||
+ ((expr) >> 16 & 1'b1) + ((expr) >> 17 & 1'b1) + ((expr) >> 18 & 1'b1) + ((expr) >> 19 & 1'b1) \
|
||||
+ ((expr) >> 20 & 1'b1) + ((expr) >> 21 & 1'b1) + ((expr) >> 22 & 1'b1) + ((expr) >> 23 & 1'b1) \
|
||||
+ ((expr) >> 24 & 1'b1) + ((expr) >> 25 & 1'b1) + ((expr) >> 26 & 1'b1) + ((expr) >> 27 & 1'b1) \
|
||||
+ ((expr) >> 28 & 1'b1) + ((expr) >> 29 & 1'b1) + ((expr) >> 30 & 1'b1) + ((expr) >> 31 & 1'b1) \
|
||||
)
|
||||
|
||||
module top;
|
||||
reg [31:0] data;
|
||||
|
||||
`define TEST(idx, pattern, in_width, out_width) \
|
||||
localparam p``idx = pattern; \
|
||||
wire [in_width - 1:0] i``idx; \
|
||||
wire [out_width - 1:0] o``idx; \
|
||||
assign i``idx = data[0+:in_width]; \
|
||||
Example #(p``idx, in_width) e``idx(i``idx, o``idx);
|
||||
|
||||
`TEST(1, 5'b10101, 5, 3)
|
||||
`TEST(2, 10'b1110001111, 10, 7)
|
||||
|
||||
integer i;
|
||||
initial begin
|
||||
data = 0;
|
||||
for (i = 0; i < 100; i = i + 1) begin
|
||||
data = 1664525 * data + 1013904223;
|
||||
#1 $display("%b %b %b", data, o1, o2);
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
Reference in New Issue
Block a user