mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	This is primarily intended to enable the standard-permitted use of module-scoped identifiers to refer to tasks and non-constant functions. As a side-effect, this also adds support for the non-standard use of module-scoped identifiers referring to constant functions, a feature that is supported in some other tools, including Iverilog.
		
			
				
	
	
		
			45 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Verilog
		
	
	
	
	
	
| // Some strict implementatins either forbid hierarchical identifiers within
 | |
| // constant expressions, or forbid declaring functions in generate blocks, or
 | |
| // both. Yosys and Iverilog are not strict in either of these ways.
 | |
| module module_scope_func_top(
 | |
|     input wire inp,
 | |
|     output wire [31:0] out1, out2, out4, out5, out7, out8,
 | |
|     output reg [31:0] out3, out6, out9
 | |
| );
 | |
|     function automatic integer incr;
 | |
|         input integer value;
 | |
|         incr = value + 1;
 | |
|     endfunction
 | |
|     task send;
 | |
|         output integer out;
 | |
|         out = 55;
 | |
|     endtask
 | |
| 
 | |
|     assign out1 = module_scope_func_top.incr(inp);
 | |
|     localparam C = module_scope_func_top.incr(10);
 | |
|     assign out2 = C;
 | |
|     initial module_scope_func_top.send(out3);
 | |
| 
 | |
|     if (1) begin : blk
 | |
|         // shadows module_scope_func_top.incr
 | |
|         function automatic integer incr;
 | |
|             input integer value;
 | |
|             incr = value * 2;
 | |
|         endfunction
 | |
|         // shadows module_scope_func_top.send
 | |
|         task send;
 | |
|             output integer out;
 | |
|             out = 66;
 | |
|         endtask
 | |
| 
 | |
|         assign out4 = module_scope_func_top.incr(inp);
 | |
|         localparam D = module_scope_func_top.incr(20);
 | |
|         assign out5 = D;
 | |
|         initial module_scope_func_top.send(out6);
 | |
| 
 | |
|         assign out7 = incr(inp);
 | |
|         localparam E = incr(30);
 | |
|         assign out8 = E;
 | |
|         initial send(out9);
 | |
|     end
 | |
| endmodule
 |