Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
饶先宏
hdl4se
提交
cd6bc7f0
H
hdl4se
项目概览
饶先宏
/
hdl4se
通知
12
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hdl4se
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
cd6bc7f0
编写于
8月 08, 2021
作者:
饶先宏
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
202108082148 改进多线程,尽可能用原子操作替代threadlock
上级
010a1efa
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
218 addition
and
10 deletion
+218
-10
hdl4secell/include/hdl4secell.h
hdl4secell/include/hdl4secell.h
+4
-0
hdl4secell/src/hdl4se_fifo.c
hdl4secell/src/hdl4se_fifo.c
+152
-5
hdl4secell/src/hdl4se_general.c
hdl4secell/src/hdl4se_general.c
+3
-0
hdl4sesim/src/hdl4sesim.c
hdl4sesim/src/hdl4sesim.c
+30
-0
hdl4seutils/include/threadlock.h
hdl4seutils/include/threadlock.h
+25
-0
parser/verilog_expr.c
parser/verilog_expr.c
+4
-5
未找到文件。
hdl4secell/include/hdl4secell.h
浏览文件 @
cd6bc7f0
...
...
@@ -275,6 +275,10 @@ IHDL4SEModuleVar* hdl4seCreateModule3(HOBJECT parent, const char* clsid, const c
#define MODULE_DATA_TYPE M_ID(sHDL4SE_data)
#define MODULE_DATA_STRUCT M_ID(_sHDL4SE_data)
#define DEFINE_FUNC_DEPEND(funcname, dependlist) \
static const char * __##funcname##_depend_list = dependlist; \
static int funcname(MODULE_DATA_TYPE* pobj) {
#define DEFINE_FUNC(funcname) \
static int funcname(MODULE_DATA_TYPE* pobj) {
...
...
hdl4secell/src/hdl4se_fifo.c
浏览文件 @
cd6bc7f0
...
...
@@ -74,7 +74,7 @@ MODULE_DECLARE(hdl4se_fifo)
int
reset
;
END_MODULE_DECLARE
(
hdl4se_fifo
)
DEFINE_FUNC
(
hdl4se_fifo_gen_bReadData
)
{
DEFINE_FUNC
_DEPEND
(
hdl4se_fifo_gen_bReadData
,
"readpos"
)
{
unsigned
int
readaddr
=
vget
(
readpos
);
var
readdata
=
Var
(
bReadData
);
unsigned
int
j
;
...
...
@@ -83,15 +83,150 @@ DEFINE_FUNC(hdl4se_fifo_gen_bReadData) {
}
}
END_DEFINE_FUNC
DEFINE_FUNC
(
hdl4se_fifo_gen_wDataValid
)
{
DEFINE_FUNC
_DEPEND
(
hdl4se_fifo_gen_wDataValid
,
"wReadEn"
)
{
VAssign
(
wDataValid
,
wReadEn
);
}
END_DEFINE_FUNC
DEFINE_FUNC
(
hdl4se_fifo_gen_wWriteEnable
)
{
DEFINE_FUNC
_DEPEND
(
hdl4se_fifo_gen_wWriteEnable
,
"wWriteEn"
)
{
VAssign
(
wWriteEnable
,
wWriteEn
);
}
END_DEFINE_FUNC
DEFINE_FUNC
(
hdl4se_fifo_ClkTick
)
{
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_readpos
,
"readpos, wRead, wReadEn"
)
{
if
(
pobj
->
reset
==
0
)
{
vput
(
readpos
,
0
);
}
else
{
if
(
vget
(
wRead
)
&&
vget
(
wReadEn
))
{
unsigned
int
readaddr
=
vget
(
readpos
);
readaddr
=
readaddr
+
1
;
if
(
readaddr
>=
pobj
->
depth
)
readaddr
=
0
;
vput
(
readpos
,
readaddr
);
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_writepos
,
"writepos, wWrite, wWriteEn"
)
{
if
(
pobj
->
reset
==
0
)
{
vput
(
writepos
,
0
);
}
else
{
if
(
vget
(
wWrite
)
&&
vget
(
wWriteEn
))
{
unsigned
int
writeaddr
=
vget
(
writepos
);
writeaddr
=
writeaddr
+
1
;
if
(
writeaddr
>=
pobj
->
depth
)
writeaddr
=
0
;
vput
(
writepos
,
writeaddr
);
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_outputcount
,
"wRead, wReadEn, outputcount"
)
{
if
(
pobj
->
reset
==
0
)
{
vput
(
outputcount
,
0
);
}
else
{
if
(
vget
(
wRead
)
&&
vget
(
wReadEn
))
{
vput
(
outputcount
,
vget
(
outputcount
)
+
1
);
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_inputcount
,
"wWrite, wWriteEn, inputcount"
)
{
if
(
pobj
->
reset
==
0
)
{
vput
(
inputcount
,
0
);
}
else
{
if
(
vget
(
wWrite
)
&&
vget
(
wWriteEn
))
{
vput
(
inputcount
,
vget
(
inputcount
)
+
1
);
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_count
,
"readpos, writepos"
)
{
unsigned
int
readaddr
=
vget
(
readpos
);
unsigned
int
writeaddr
=
vget
(
writepos
);
unsigned
int
datacount
;
if
(
writeaddr
<
readaddr
)
datacount
=
writeaddr
+
pobj
->
depth
-
readaddr
;
else
datacount
=
writeaddr
-
readaddr
;
vput
(
count
,
datacount
);
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_maxcount
,
"readpos, writepos, maxcount"
)
{
if
(
pobj
->
reset
==
0
)
{
vput
(
maxcount
,
0
);
}
else
{
unsigned
int
readaddr
=
vget
(
readpos
);
unsigned
int
writeaddr
=
vget
(
writepos
);
unsigned
int
datacount
;
unsigned
int
maxcount
;
if
(
writeaddr
<
readaddr
)
datacount
=
writeaddr
+
pobj
->
depth
-
readaddr
;
else
datacount
=
writeaddr
-
readaddr
;
maxcount
=
vget
(
maxcount
);
if
(
maxcount
<
datacount
)
{
maxcount
=
datacount
;
vput
(
maxcount
,
maxcount
);
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_wReadEn
,
"readpos, writepos, wRead, wReadEn, wWrite, wWriteEn"
)
{
unsigned
int
readaddr
=
vget
(
readpos
);
unsigned
int
writeaddr
=
vget
(
writepos
);
if
(
vget
(
wRead
)
&&
vget
(
wReadEn
))
{
readaddr
=
readaddr
+
1
;
if
(
readaddr
>=
pobj
->
depth
)
readaddr
=
0
;
}
vput
(
wReadEn
,
(
readaddr
!=
writeaddr
)
?
1
:
0
);
}
END_DEFINE_FUNC
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_gen_wWriteEn
,
"readpos, writepos, wRead, wReadEn, wWrite, wWriteEn"
)
{
if
(
pobj
->
reset
==
0
)
{
vput
(
wWriteEn
,
0
);
}
else
{
unsigned
int
readaddr
=
vget
(
readpos
);
unsigned
int
writeaddr
=
vget
(
writepos
);
unsigned
int
datacount
;
if
(
writeaddr
<
readaddr
)
datacount
=
writeaddr
+
pobj
->
depth
-
readaddr
;
else
datacount
=
writeaddr
-
readaddr
;
vput
(
wWriteEn
,
(
datacount
>=
pobj
->
depth
-
4
)
?
0
:
1
);
}
}
END_DEFINE_FUNC
#define DEPEND_OPT 0
#if DEPEND_OPT
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_ClkTick
,
"nwReset, readpos, writepos, wRead, wReadEn, outputcount, wWrite, wWriteEn, inputcount, maxcount"
)
{
if
(
pobj
->
reset
==
0
)
{
if
(
vget
(
nwReset
)
!=
0
)
{
pobj
->
reset
=
1
;
}
}
else
{
if
(
vget
(
wWrite
)
&&
vget
(
wWriteEn
))
{
int
j
;
unsigned
int
writeaddr
=
vget
(
writepos
);
var
writedata
=
Var
(
bWriteData
);
for
(
j
=
0
;
j
<
pobj
->
wordsize
;
j
++
)
{
pobj
->
fifo_data
[
writeaddr
*
pobj
->
wordsize
+
j
]
=
varGetBits32
(
writedata
,
j
);
}
}
}
}
END_DEFINE_FUNC
#else
DEFINE_FUNC_DEPEND
(
hdl4se_fifo_ClkTick
,
"nwReset, readpos, writepos, wRead, wReadEn, outputcount, wWrite, wWriteEn, inputcount, maxcount"
)
{
if
(
pobj
->
reset
==
0
)
{
if
(
vget
(
nwReset
)
==
0
)
{
vput
(
readpos
,
0
);
...
...
@@ -144,6 +279,7 @@ DEFINE_FUNC(hdl4se_fifo_ClkTick) {
vput
(
wWriteEn
,
(
datacount
>=
pobj
->
depth
-
4
)
?
0
:
1
);
}
}
END_DEFINE_FUNC
#endif
DEFINE_FUNC
(
M_ID
(
deinit
))
{
if
(
pobj
->
fifo_data
!=
NULL
)
...
...
@@ -171,14 +307,25 @@ MODULE_INIT(hdl4se_fifo)
GPORT_OUT
(
wWriteEnable
,
1
,
hdl4se_fifo_gen_wWriteEnable
);
PORT_IN
(
wWrite
,
1
);
PORT_IN
(
bWriteData
,
pobj
->
width
);
#if DEPEND_OPT
GREG
(
readpos
,
32
,
hdl4se_fifo_gen_readpos
);
GREG
(
writepos
,
32
,
hdl4se_fifo_gen_writepos
);
GREG
(
wReadEn
,
1
,
hdl4se_fifo_gen_wReadEn
);
GREG
(
wWriteEn
,
1
,
hdl4se_fifo_gen_wWriteEn
);
GREG
(
inputcount
,
32
,
hdl4se_fifo_gen_inputcount
);
GREG
(
outputcount
,
32
,
hdl4se_fifo_gen_outputcount
);
GWIRE
(
count
,
32
,
hdl4se_fifo_count
);
GREG
(
maxcount
,
32
,
hdl4se_fifo_gen_maxcount
);
#else
REG
(
readpos
,
32
);
REG
(
writepos
,
32
);
REG
(
wReadEn
,
1
);
REG
(
wWriteEn
,
1
);
REG
(
inputcount
,
32
);
REG
(
outputcount
,
32
);
REG
(
count
,
32
);
WIRE
(
count
,
32
);
REG
(
maxcount
,
32
);
#endif
CLKTICK_FUNC
(
hdl4se_fifo_ClkTick
);
DEINIT_FUNC
(
M_ID
(
deinit
));
...
...
hdl4secell/src/hdl4se_general.c
浏览文件 @
cd6bc7f0
...
...
@@ -92,10 +92,13 @@ static int gen_none(void * p)
static
MODULE_FUNC
get_gen_func_and_set_none
(
ModuleVariable
*
var
)
{
MODULE_FUNC
genfunc
;
genfunc
=
LOCKED_SWAP_POINTER
(
var
->
moduledata
->
cur_funcs
.
array
[
var
->
genfuncindex
],
gen_none
);
/*
threadlockLock(var->moduledata->lock);
genfunc = (MODULE_FUNC)var->moduledata->cur_funcs.array[var->genfuncindex];
var->moduledata->cur_funcs.array[var->genfuncindex] = gen_none;
threadlockUnlock(var->moduledata->lock);
*/
return
genfunc
;
}
...
...
hdl4sesim/src/hdl4sesim.c
浏览文件 @
cd6bc7f0
...
...
@@ -470,6 +470,36 @@ softmax_168 complete
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=9937.836066cps, LSPD=16384.000000cps
get_func_and_set_none:
clocks: 1802240, TSPD=10298.514286cps, LSPD=8192.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=10274.711864cps, LSPD=8192.000000cps
fifo gen_depend:
clocks: 1802240, TSPD=8966.368159cps, LSPD=8192.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=8958.738916cps, LSPD=8192.000000cps
gen_depend + get_func_and_set_none:
clocks: 1802240, TSPD=9586.382979cps, LSPD=16384.000000cps
softmax_168 complete
0.4901 n03085013 computer keyboard, keypad
0.1591 n04264628 space bar
0.0543 n04074963 remote control, remote
0.0439 n03832673 notebook, notebook computer
0.0356 n04505470 typewriter keyboard
clocks: 1818624, TSPD=9571.705263cps, LSPD=8192.000000cps
threadcount=8
clocks: 1867776, TSPD=9529.469388cps, LSPD=16384.000000cps
softmax_168 complete
...
...
hdl4seutils/include/threadlock.h
浏览文件 @
cd6bc7f0
...
...
@@ -56,6 +56,31 @@ int threadlockDestroy(THREADLOCK lock);
void
*
mt_malloc
(
size_t
size
);
void
mt_free
(
void
*
);
#ifdef WIN32
#include "windows.h"
#define LOCKED_INCREMENT(p) InterlockedIncrement(&p)
#define LOCKED_DECREMENT(p) InterlockedDecrement(&p)
#define LOCKED_SWAP_POINTER(p, v) InterlockedExchangePointer(&p, v)
#endif
#ifdef __GNUC__
#define LOCKED_INCREMENT(p) __sync_fetch_and_add(&p, 1);
#define LOCKED_DECREMENT(p) __sync_fetch_and_sub(&p, 1);
#define LOCKED_SWAP_POINTER(p, v) __sync_val_compare_and_swap(&p, p, v)
#endif
#ifndef LOCKED_INCREMENT
#define LOCKED_INCREMENT(p) p++
#define LOCKED_DECREMENT(p) p--
static
void
*
locked_swap_pointer
(
void
**
p
,
void
*
v
)
{
void
*
ret
=
v
;
*
p
=
v
;
return
ret
;
}
#define LOCKED_SWAP_POINTER(p, v) locked_swap_pointer(&p, v)
#endif
#endif
#ifdef __cplusplus
...
...
parser/verilog_expr.c
浏览文件 @
cd6bc7f0
...
...
@@ -814,7 +814,6 @@ returnnum:
{
/* 返回栈顶 */
IDListVar
*
stacktop
;
IBigNumber
**
stacktopnum
=
NULL
;
int
ret
;
*
index
=
i
;
stacktop
=
calcstack
.
__dlist_pLast
;
ASSERT
(
stacktop
!=
&
calcstack
);
...
...
@@ -906,7 +905,7 @@ static int expr_verilognode_procheck(HOBJECT object, HOBJECT module, void * para
return
1
;
case
EXPRTYPE_STRING
:
pobj
->
data
.
isconst
=
0
;
pobj
->
data
.
width
=
strlen
(
pobj
->
data
.
value
->
string
)
*
8
;
pobj
->
data
.
width
=
(
int
)
strlen
(
pobj
->
data
.
value
->
string
)
*
8
;
return
0
;
break
;
case
EXPRTYPE_PARAM
:
...
...
@@ -2002,7 +2001,7 @@ const char * verilogparseGenExprStr(HOBJECT expr, HOBJECT module)
if
(
width
<=
32
)
sprintf
(
hdl4se_parse_logbuf
(),
"(VREAD_U32(%s) >> %d) & 0x%x"
,
select
->
name
->
string
,
v_lsb
,
(
0xffffffff
>>
(
32
-
(
v_msb
-
v_lsb
+
1
))));
else
sprintf
(
hdl4se_parse_logbuf
(),
"(VREAD_U64(%s) >> %d) & 0x%xllu"
,
select
->
name
->
string
,
v_lsb
,
(
0xffffffffffffffffllu
>>
(
64
-
(
v_msb
-
v_lsb
+
1
))));
sprintf
(
hdl4se_parse_logbuf
(),
"(VREAD_U64(%s) >> %d) & 0x%
ll
xllu"
,
select
->
name
->
string
,
v_lsb
,
(
0xffffffffffffffffllu
>>
(
64
-
(
v_msb
-
v_lsb
+
1
))));
}
}
else
{
...
...
@@ -2033,7 +2032,7 @@ const char * verilogparseGenExprStr(HOBJECT expr, HOBJECT module)
return
NULL
;
}
const
char
*
verilogparseGenExprStrVar
(
HOBJECT
expr
,
HOBJECT
module
,
c
onst
c
har
*
linehead
)
const
char
*
verilogparseGenExprStrVar
(
HOBJECT
expr
,
HOBJECT
module
,
char
*
linehead
)
{
int
width
;
sExpr
*
pobj
;
...
...
@@ -2075,7 +2074,7 @@ const char * verilogparseGenExprStrVar(HOBJECT expr, HOBJECT module, const char
}
}
}
else
{
sprintf
(
hdl4se_parse_logbuf
(),
"varConstStr(
\"\"
)"
,
pobj
->
data
.
value
->
string
);
sprintf
(
hdl4se_parse_logbuf
(),
"varConstStr(
\"
%s
\"
)"
,
pobj
->
data
.
value
->
string
);
}
objectRelease
(
number
);
return
hdl4se_parse_logbuf
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录