---
# System prepended metadata

title: 'Caravel-soc_fpga always block value assign issue : simulation fail in using systemverilog but pass in verilog issue'
tags: [systemverilog, fsic, xvlog, transfer done, xelab, xsim]

---

Caravel-soc_fpga always block value assign issue : simulation fail in using systemverilog but pass in verilog issue

# fail waveform when use systemverilog
[code commit](https://github.com/TonyHo722/caravel-soc_fpga/commit/a53f49b6406786f109cb86b2b8c800a2c4954b2f)

- execution as below
```
(base) tonyho@ubuntu5:~/workspace/fsic/caravel-soc_fpga_josh_2022.2/testbench/counter_la$ ./run_sv
```
![](https://hackmd.io/_uploads/S1PY1hxpn.png)

- the waveform in CsrPlugin_mstatus_MIE is different


# pass wavefrom in verilog
- execution as below
```
(base) tonyho@ubuntu5:~/workspace/fsic/caravel-soc_fpga_josh_2022.2/testbench/counter_la$ ./run_xsim 
```
![](https://hackmd.io/_uploads/Hk4dyhgT2.png)

# the different in run_xsim and run_sv

```
(base) tonyho@ubuntu5:~/workspace/fsic/caravel-soc_fpga_josh_2022.2/testbench/counter_la$ diff run_xsim run_sv
17c17,19
< xvlog -d FUNCTIONAL -d SIM -d DUNIT_DELAY=#1 -d USE_POWER_PINS -f ./include.rtl.list.xsim counter_la_tb.v \
---
> xvlog -d FUNCTIONAL -d SIM -d DUNIT_DELAY=#1 -d USE_POWER_PINS -f ./include.rtl.list.xsim counter_la_tb.sv \
>       -sv \
>       -d CPU_TRACE \
20a23
> 


```

# waveform different in la_output[127:0]
![](https://hackmd.io/_uploads/ByfFS3lpn.png)
![](https://hackmd.io/_uploads/Hknarheah.png)



## initial value issue in verilog and systemverlog
[code commit](https://github.com/TonyHo722/caravel-soc_fpga/commit/8240837a4e5d2482fbeab7a2a6d1892ba35837f6)

```
commit 8240837a4e5d2482fbeab7a2a6d1892ba35837f6 (HEAD -> debug_sv, origin/debug_sv)
Author: tonyho <TonyHo@via.com.tw>
Date:   Mon Aug 21 18:57:19 2023 +0800

commit 16ed151e72455ad87503e8de5c33b9574ed6dc29
Author: tonyho <TonyHo@via.com.tw>
Date:   Mon Aug 21 18:52:46 2023 +0800

    add debug message for blocking assigment

diff --git a/rtl/soc-efabless/mgmt_core.v b/rtl/soc-efabless/mgmt_core.v
index d3e43d7..4f413cb 100644
--- a/rtl/soc-efabless/mgmt_core.v
+++ b/rtl/soc-efabless/mgmt_core.v
@@ -4499,6 +4499,7 @@ always @(*) begin
 end
 always @(*) begin
        la_output = 128'd0;
+       $display($time, "=> 1st a_output=%x", la_output);^M
        la_output[0] = la_out_storage[0];
        la_output[1] = la_out_storage[1];
        la_output[2] = la_out_storage[2];
@@ -4627,6 +4628,7 @@ always @(*) begin
        la_output[125] = la_out_storage[125];
        la_output[126] = la_out_storage[126];
        la_output[127] = la_out_storage[127];
+       $display($time, "=> 2nd la_output=%x", la_output);^M
 end
 assign spi_enabled = spi_enabled_storage;
 assign user_irq_ena = user_irq_ena_storage;

```
### verilog xsim log
```
# xsim {counter_la_tb_elab} -autoloadwcfg -runall
Time resolution is 1 ps
run -all
Reading counter_la.hex
counter_la.hex loaded into memory
Memory 5 bytes = 0x6f 0x00 0x00 0x0b 0x13
                   0=> 1st la_output=00000000000000000000000000000000
                   0=> 2nd la_output=00000000000000000000000000000000
LA Test 1 started
LA Test 2 passed
USER_PROJ_IRQ0 Test passed

```
## SystemVerilog xsim log
- no output in la_output
```
# xsim {counter_la_tb_elab} -autoloadwcfg -runall
Time resolution is 1 ps
run -all
Reading counter_la.hex
counter_la.hex loaded into memory
Memory 5 bytes = 0x6f 0x00 0x00 0x0b 0x13
        0.000ns MSG counter_la_tb, cpu_exec.log generated
LA Test 1 started
LA Test 2 passed

Monitor: Timeout, Test LA (RTL) Failed

```

# check reset in mgmt_core.v

```
reg int_rst = 1'd1;
```
[code link](https://github.com/TonyHo722/caravel-soc_fpga/blob/b36ba76c72574fd3b8046d3841cdb93d36e59e0f/rtl/soc-efabless/mgmt_core.v#L89)


```
assign sys_rst = int_rst;
```
[code link](https://github.com/TonyHo722/caravel-soc_fpga/blob/b36ba76c72574fd3b8046d3841cdb93d36e59e0f/rtl/soc-efabless/mgmt_core.v#L1840)


```
always @(posedge por_clk) begin
	int_rst <= core_rst;
end
```
[code link](https://github.com/TonyHo722/caravel-soc_fpga/blob/b36ba76c72574fd3b8046d3841cdb93d36e59e0f/rtl/soc-efabless/mgmt_core.v#L6743C1-L6745C4)

```
reg [127:0] la_out_storage = 128'd0;
```
[code link](https://github.com/TonyHo722/caravel-soc_fpga/blob/b36ba76c72574fd3b8046d3841cdb93d36e59e0f/rtl/soc-efabless/mgmt_core.v#L705)

```
always @(*) begin
	la_output = 128'd0;
	la_output[0] = la_out_storage[0];
	la_output[1] = la_out_storage[1];
	la_output[2] = la_out_storage[2];
```
[code link](https://github.com/TonyHo722/caravel-soc_fpga/blob/b36ba76c72574fd3b8046d3841cdb93d36e59e0f/rtl/soc-efabless/mgmt_core.v#L4500)

```
always @(posedge sys_clk) begin
    ...
	if (sys_rst) begin
        ...
        la_out_storage <= 128'd0;
        ...
    end        
    ...
end        
```

[code link](https://github.com/TonyHo722/caravel-soc_fpga/blob/b36ba76c72574fd3b8046d3841cdb93d36e59e0f/rtl/soc-efabless/mgmt_core.v#L8022)


# code to repro this issue

![](https://hackmd.io/_uploads/SkNCCgQp2.png)

- xvlog using systemverilog by `-sv` then no execution always block when T = 0 as belowvi .

```
    always @(*) begin
        $display("=> checkpoint 1");
        la_output = 128'd0;
        $display("=> checkpoint 2");
        la_output = la_out_storage;
        $display("=> checkpoint 3");
    end   
```

[code Link](https://github.com/TonyHo722/xvlog_systemverilog/blob/main/xvlog_tb.v#L42)

# patch soultion

## method 1 - change .v code to using alwyas_comb

```
    alwyas_comb begin
        $display("=> checkpoint 1");
        la_output = 128'd0;
        $display("=> checkpoint 2");
        la_output = la_out_storage;
        $display("=> checkpoint 3");
    end   
```